cron, jede Minute RAM-Probleme

cron, jede Minute RAM-Probleme

Ich habe einen Cronjob, der PHP auf einer WordPress-cron.php-Datei ausführt. Er wird hauptsächlich zum Planen von Posts verwendet und ich glaube, er kann den Cache aktualisieren.

Ich führe den Cron-Job jede Minute aus. Ich habe mir die PS oft angesehen und sehe ZWEI PHP-Instanzen, die cron.php ausführen. Das ist jetzt unnötig, weil das Ausführen einer Instanz alles erledigt, was nötig ist. Ich habe einen anderen Job, der den RAM prüft, und manchmal lösen zwei Instanzen ihn aus (ich erwarte, dass immer eine große Menge RAM verfügbar ist, ich kann ihn verringern, möchte das aber nicht). Ich glaube kaum, dass ein Job länger als eine Minute dauern kann (obwohl das möglich ist).

Wie führe ich einen Job aus, aber nicht, wenn der Prozess bereits vorhanden ist? Ich glaube nicht, dass der PHP-Code selbst eine Überprüfung durchführen kann, es sei denn, er stellt eine Verbindung zur Datenbank her/verwendet sie. Gibt es einen Cron-Befehl, den ich verwenden kann? Ich möchte eine Instanz nicht beenden, wenn sie länger als 1 Minute dauert. Nur keine neuen erstellen.

Antwort1

Hier ist eine einfache Bash-Skript-Lösung; Sie können wahrscheinlich dasselbe im Skript cron.php tun. Es prüft tatsächlich auf Prozesse, die zu lange laufen; für ein automatisiertes System ist das wahrscheinlich eine gute Idee.

#!/bin/bash

# Exit if process is already running
if test -e /tmp/wordpress-job.pid; then
  # Check if the pid that was stored in /tmp/wordpress-job.pid does exist
  if ps ax -o pid= | grep $(cat /tmp/wordpress-job.pid ) &> /dev/null; then
    exit 0
  fi
fi

# Create the file that marks this process as running
echo $$ > /tmp/wordpress-job.pid

# Some extra security check to prevent the pid file
# to survive.
trap "rm -f /tmp/wordpress-job.pid" EXIT TERM INT HUP 

# Start the long-running process in the background
sleep 3600 & # long-running process

# Sleep some time before trying to kill that process
sleep 300

# Kill job if it takes longer than it should
kill %1

# Delete the file that marks this process as running
rm -f /tmp/wordpress-job.pid

Sie müssen „sleep 3600“ durch Ihre PHP-Befehlszeile ersetzen und die 300 darunter in die maximale Zeit ändern, die Ihr Skript ausgeführt werden darf.

Antwort2

Lassen Sie Ihren Crontab-Eintrag wie folgt ausführen:

if mv /var/run/my-php-job.pending /var/run/my-php-job.running 2>/dev/null; then
  echo $$ >|/var/run/my-php-job.running   # optional
  … # run the job
  : >|/var/run/my-php-job.running         # optional
  mv /var/run/my-php-job.running /var/run/my-php-job.pending
fi

Fügen Sie dies in einen @rebootCrontab-Eintrag ein:

rm -f /var/run/my-php-job.running
touch /var/run/my-php-job.pending

Der Name der Datei dient als Sperre. Während sie ist .running, läuft ein Job und der nächste Job wird nicht gestartet. Wenn sie ist .pending, startet der laufende Job und wechselt zu .running.

Wenn Sie die optionalen Zeilen einschließen, wird die Prozess-ID der Shell in die .runningDatei geschrieben, damit Sie untersuchen können, ob ein Job hängen bleibt. Eine Protokolldatei würde dies weitgehend überflüssig machen.

Wenn die Shell, die den Job ausführt, abstürzt (was unwahrscheinlich ist und nur passieren kann, wenn sie jemand absichtlich beendet oder wenn nicht genügend Arbeitsspeicher vorhanden ist), bleibt die Sperrdatei hängen .running. (Wenn der Job selbst abstürzt, ist das kein Problem.) Sie können den plötzlichen Tod eines vorherigen Skripts erkennen, aber das ist wesentlich schwieriger.

Antwort3

Es gibt spezielle Dienstprogramme zum Vermeiden paralleler Läufe: flock in Util-Linux, lockf in BSD-Systemen, shlock in NetBSD und mit INN- und Cnews-Paketen.

Im wahrscheinlichsten Fall (Linux) rufen Sie etwas Ähnliches auf wie:

flock -w 60 /somedir/lockfile cron.php

Die Rezepte in den anderen Antworten sind Alternativen zu selbstgemachter Herde und sind nur dann sinnvoll, wenn ein solches Mittel nicht vorhanden ist.

Andererseits können Sie mit einer solchen Sperre direkt in Ihrem Programm umgehen, Sie sollten jedoch alle Einzelheiten sorgfältig wiederholen, da es sonst zu einem Race Condition kommen kann.

verwandte Informationen