crontab, Instanz, Speicherprobleme+Spamming

crontab, Instanz, Speicherprobleme+Spamming

Ich habe einen Cronjob, der jede Minute php5 wp-cron.php ausführt, um meine Website zu aktualisieren.

Es ist jedoch etwas passiert und ich hatte mehr als 30 Instanzen davon (31 ist auf diesem einen Dump von markiert ps aux). Es hat meinen RAM aufgefressen, weitere Instanzen wurden aufgrund von Speichermangel beendet und ich konnte mich nicht per SSH mit der Box verbinden.

Ich kann nicht verstehen, warum Instanzen länger als 30 Minuten aktiv waren, normalerweise dauert eine ein paar Sekunden. An dem Tag, als es passierte, hatte ich keine Jobs geplant (obwohl WP Cache es vielleicht verwendet hat? Aber ich hatte vorher nie ein Problem)

Was kann ich tun, um zu verhindern, dass ein Cronjob meinen Speicher mit Spam überflutet und zerstört? Gibt es eine Möglichkeit, zu sagen, dass er nicht gestartet werden soll, wenn eine Instanz aktiv ist? Und wenn eine Instanz länger als 5 Minuten aktiv ist, sie zu beenden?

Gibt es eine Möglichkeit, mich davor zu schützen, dass so etwas passiert?

Antwort1

Ich denke, das Erste, was Sie tun müssen, ist, den Schuldigen zu finden, der möglicherweise 31 Instanzen dieses Jobs verursacht hat. Normalerweise könnte es daran liegen, dass Ihr Programm irgendwann hängen bleibt. Sie sollten dieses Problem debuggen und beheben, es sei denn, Sie möchten nicht, dass Ihre Website erfolgreich aktualisiert wird.

Für die Frage „Gibt es eine Möglichkeit, nicht zu starten, wenn eine Instanz aktiv ist?“: Ja, es gibt mehrere Möglichkeiten. Eine davon besteht darin, einfach zu prüfen, pgrep yourprogramnameob bereits eine Instanz vorhanden ist. Wenn ja, können Sie pkill -x yourprogramnamesie alle beenden.

Antwort2

Um zu verhindern, dass mehrere Kopien ausgeführt werden, verwenden Sie flock (Linux), lockf (FreeBSD) oder shlock (bei manchen Systemen vorhanden, weniger zuverlässig). Dadurch wird die Ausführungszeit nicht begrenzt, aber sichergestellt, dass nur ein Prozess ausgeführt wird. Wenn er dann hängt, können Sie seinen Status im laufenden Betrieb analysieren.

Sie können die CPU-Zeit des erzeugten Prozesses mit der integrierten Shell „ulimit“ begrenzen.

Um die Wartezeit zu begrenzen, können Sie ein Skript schreiben, das auf die Beendigung eines Prozesses wartet und ihn nach Ablauf der Zeit beendet. In Python/Perl/usw. ist das einfacher, aber die Shell erlaubt dies auch (mithilfe von Trap und/oder Hintergrund-Children).

Manchmal ist es sinnvoll, eine feste Zeitspanne zwischen den Aufrufen anzugeben (z. B. vom Ende des vorherigen Aufrufs bis zum Beginn des nächsten Aufrufs), anstatt wie bei Cron einen Aufrufbeginn festzulegen. Gewöhnliche Cron-Varianten erlauben dies nicht, Sie sollten ein spezielles Skript ausführen.

verwandte Informationen