Wie kann verhindert werden, dass Benutzer-Cron-Jobs die Server beschädigen?

7

Es kommt ziemlich häufig vor, dass Benutzer-Cron-Jobs auf gemeinsam genutzten Servern alle gleichzeitig ausgeführt werden und in Streit geraten (so nahe ich es beurteilen konnte). Die Last explodiert, Nagios ist wütend, Apache reagiert nicht mehr, Sie können nicht SSH-fähig machen, weil das Zeitlimit abgelaufen ist usw. Ich bin nicht in der Lage, einseitig zu entscheiden, dass Benutzer keine Cron ausführen können, aber ich möchte um dieses Problem zu bekämpfen, bei dem pgrep crond | wc -l> 50 zurückgibt.

Es scheint möglich zu sein, sie zu verschieben, indem die Anzahl der zu einem bestimmten Zeitpunkt oder ähnlich ausgeführten Crond-Prozesse begrenzt wird (wie das Senden von SIGSTOP, bis einige von ihnen nur noch weniger hackig sind), aber ich habe noch keine guten Hinweise gefunden.

Die Hardware: 4 CPU und höher, Low-End ist Dell 1435s mit ~ 8 GB Speicher, RAID 10 WD EADS Meist Plesk und cPanel, aber auch einige böse Sphera-Systeme.

Wie gehen Sie mit diesem Problem um, sf?

Wyatt
quelle

Antworten:

5

Sie können den Benutzerzugriff auf cron verwenden cron.allowund cron.denyeinschränken, oder Sie können PAM-Beschränkungen verwenden , um die CPU-Auslastung, die Anzahl der Prozesse und ähnliches zu begrenzen. Abgesehen davon besteht die Lösung darin, etwas zu erstellen, um cronJobs von Benutzern zu überwachen und zu bearbeiten, da cron nicht wirklich eine Begrenzung für die Anzahl der auszuführenden Jobs hat.

Ich denke, CPanel hat etwas über die Anzahl der gleichzeitig ausgeführten Cron-Jobs, aber es ist ein spezifisches Tool (nicht sicher).

Core-Dump
quelle
Oh, danke, ich muss mich um die PAM-Grenzen kümmern. Das könnte zumindest helfen, das Problem zu mildern, wenn nicht sogar zu lösen.
Wyatt
2

Ich denke, Sie haben eines dieser Probleme:

  • Nicht genügend Speicher, um die Crontabs gleichzeitig auszuführen. Sie können beheben durch:

    • Hinzufügen von mehr RAM
    • Begrenzung des maximalen Speichers, den ein Benutzer zuweisen kann
    • Planen Sie die Jobs neu, um die Anzahl der gleichzeitigen Jobs zu verringern. Möglicherweise müssen Sie crond ersetzen und einen anderen Scheduler verwenden
  • hohe E / A. Sie können beheben durch:

    • Verringern der E / A-Priorität mit ionice
    • Planen Sie die Jobs neu, um die Anzahl der gleichzeitigen Jobs zu verringern

Versuchen Sie herauszufinden, ob die Maschine ausgetauscht wird und ob sie während der Nacht nicht ausgetauscht wird, und ändern Sie die Cron-E / A-Prioritätsklasse in Leerlauf:

sudo ionice -c 3 -p $(pgrep cron)
Mircea Vutcovici
quelle
Es ist definitiv keine Erinnerung; Die meisten dieser Boxen haben ungefähr 28 GB und keine weniger als 8. Die Verwendung eines anderen Schedulers wäre ziemlich zeitaufwändig zum Testen und Bewerten. Ionice war mir eingefallen, aber für zwei Probleme: 1) Einige von ihnen führen Kernel aus, die älter als 2.6.13 sind, und 2) es kann nicht etwas sein, bei dem wir es auf frischer Tat ertappen müssen, um es zu beheben. (Zum einen gibt es> 100 Server)
Wyatt
1

Ich habe Cronjobs immer zu zufälligen Zeiten (insbesondere Minuten) eingeplant. Ich sehe häufig Cron-Beispiele, die um Mitternacht laufen, wie:

0 0 * * *  /usr/bin/echo "Job ran"

Wenn Sie viele Jobs so definiert haben, fragen Sie nach Ärger. Leider sind dies oft lang laufende Systemjobs. Ich neige auch dazu, Jobs zu unterschiedlichen Zeiten in einem Stapelprozessfenster zu planen. (23 bis 05) Stunden.

Ich mag die neue Cron-Spezifikation, die unter Ubuntu verwendet wird. Hier gibt es mehrere /etc/cron.*Verzeichnisse, in denen Jobs ausgeführt werden sollen. Sie werden nacheinander ausgeführt, anstatt die Last parallel zu begrenzen.

Sie sollten in der Lage sein zu sehen, was in den Dateien in geplant ist /etc/spool/cron/crontabs. Das Lesen dieser Dateien erfordert Root-Zugriff. Wenn Benutzer die Probleme verursachen, besprechen Sie das Problem mit ihnen.

Sie können auch /var/log/syslognach CRON-Einträgen suchen, um zu sehen, was wann ausgeführt wird.

BillThor
quelle