2016-07-12 14 views
2

Ich habe einen crontab, die Mehrere PHP-Skripte laufen zur gleichen Zeit in Cron

* 22 * * * php /var/www/domain1/cron.php 
* 22 * * * php /var/www/domain2/cron.php 
* 22 * * * php /var/www/domain3/cron.php 
* 22 * * * php /var/www/domain4/cron.php 
... 

wie folgt

sieht jedoch die scrips oben scheint jeder zu hundert Mal gezeigt mess up und laufen op! Ich bin nicht sicher, warum das passiert, aber da sie alle gleichzeitig starten sollen, würde ich versuchen, dies zu ändern. Es sollte gesagt werden, dass, wenn ich jede Cron-Datei manuell ausführe, ich kein solches Verhalten sehe und das erwartete Verhalten erhalte.

Kann ich Cron irgendwie nur eine Zeile hintereinander laufen lassen? Wenn also domain1/cron.php ausgeführt wird, wird domain2/cron.php nicht ausgeführt, bevor domain1/cron.php beendet ist.

Ich kann die Zeit für sie nicht ändern, da ich nicht sicher sein kann, wann jeder beendet wird. In einer Domain kann es 3 Sekunden dauern, in einer anderen 30 Minuten.

+1

'* 22' bedeutet das Skript bei' 22 laufen: 00 ', '22.01 ',' 22: 02', '22: 03' bis' 22: 59'. Jedes Skript wird also 60 Mal ausgeführt. – Barmar

+0

Es stellt sich heraus, dass dies mein Fehler ist. Ich Idiot. Natürlich sollte es nur einmal laufen, was bedeutet, dass es '0 22 * ​​* *' –

Antwort

1

Wenn Sie die Root-Berechtigung haben, können Sie diesen Weg versuchen.

* 22 * * * /root/sbin/allDomainsCron.sh 

Wo allDomainsCron.sh enthält Ihre Domains cron.php eins nach dem anderen:

#!bin/bash 
php /var/www/domain1/cron.php 
php /var/www/domain2/cron.php 
php /var/www/domain3/cron.php 
php /var/www/domain4/cron.php 
... 

So Sie, dass nur ein cron.php Lauf in einer Zeit sicherstellen kann.

Wenn Sie das Skript einmal pro Tag um 22:00 Uhr laufen würde dieser Code wird die Arbeit tun:

0 22 * * * /root/sbin/allDomainsCron.sh 
+0

Ich habe diesen Ansatz zusammen mit der Behebung meines Fehlers gewählt, dass ich nicht beabsichtigt habe, das Skript jede Minute zwischen 22 und 23 auszuführen, aber nur einmal. –

+0

Warum benötigt er Root-Berechtigung? Das Skript muss nicht in '/ root' sein, es kann sich in seinem eigenen Verzeichnis befinden. – Barmar

+0

Sie haben Recht, er braucht keine root-Berechtigung, wenn das Skript woanders ist. Er muss Root-Berechtigung haben, wenn ich mein Beispiel oben benutze, wenn das Skript im Verzeichnis '/ root' ist. – szenbalu

2

Setzen Sie alle auf einer einzigen Befehlszeile, so dass sie nacheinander ausgeführt werden.

* 22 * * * php /var/www/domain1/cron.php; php /var/www/domain2/cron.php; php /var/www/domain3/cron.php; php /var/www/domain4/cron.php 

Aber da diese cron-Job 22 jede Minute während der Stunde läuft, werden Sie noch überlappen, wenn sie als eine Minute mehr nehmen.

0

Nein, eine Crontab bietet keine In-Order-Ausführung. Es ist auch unzuverlässig, Cron auf diese Weise zu verwenden. Was Sie wahrscheinlich möchten, ist stattdessen eine tatsächliche Warteschlange oder ein Job-Manager, der das Ergebnis und den Ablauf Ihrer gewünschten Jobausführung wesentlich zuverlässiger steuern kann als crontabs. Sie könnten etwas wie RabbitMQ, ZeroMQ oder Gearman dafür auschecken. Oder wenn Sie AWS verwenden, ist SQS ein guter Anfang.

Verwandte Themen