Cronjob unter Plesk/Debian/Linux funktioniert nicht – so geht’s jede Minute/Sekunde
Ihr habt mit
crontab -e
einen neuen (minütlich ausgeführten) Cronjob hinzugefügt, jedoch wird der Cronjob nicht ausgeführt?
Hier kann sich manchmal ein Fehler einschleichen, wenn Ihr das „/home“ Verzeichnis benutzt. Dieses Verzeichnis wird nämlich je nach Benutzer auch unter „/root“ gemapt. Dementsprechend solltet Ihr Eure Skripte nicht im „/home“ Verzeichnis ablegen, sondern eben unter einem anderen Ordner und dann in Eurem Crontab hierauf verweisen.
Zusätzlich solltet Ihr in die erste Zeile Eures Shellskripts
#!/bin/bash
schreiben.
Auch kann es manchmal nützlich sein die Ausgabe in ein Logfile umzuleiten, anbei ein Beispiel zur Ausführung eines Shellskripts mit Logfile…
Crontab-Beispiele
Jede Minute:
*/1 * * * * /root/test.sh >> /root/test.log 2>&1
Jede Stunde zu Minute 0:
0 * * * * /root/test.sh >> /root/test.log 2>&1
Jeden Tag um 0 Uhr:
0 0 * * * /root/test.sh >> /root/test.log 2>&1
Jeden Monat am ersten Tag um 0 Uhr:
0 0 1 * * /root/test.sh >> /root/test.log 2>&1
Jeden Montag pro Woche um 0 Uhr:
0 0 * * 1 /root/test.sh >> /root/test.log 2>&1
Ihr wollt kein Logfile? Dann ersetzt einfach
>> /root/test.log 2>&1
mit
> /dev/null 2>&1
Cronjob jede Sekunde ausführen
Es ist nicht vorgesehen jede Sekunde einen Cronjob auszuführen, demnach benötigt Ihr hier einen Workaround. Ein solcher Workaround könnte z. B. das Anlegen von 60 gleichen Cronjobs sein die alle mit einer Zeitverzögerung ausgeführt werden.
*/1 * * * * /root/second/0.sh >> /root/test.log 2>&1
*/1 * * * * /root/second/1.sh >> /root/test.log 2>&1
*/1 * * * * /root/second/2.sh >> /root/test.log 2>&1
*/1 * * * * /root/second/3.sh >> /root/test.log 2>&1
*/1 * * * * /root/second/4.sh >> /root/test.log 2>&1
...
In 0.sh würdet Ihr dann oben einfügen:
#!/bin/bash
wait 0
/root/second/run.sh
In 1.sh würdet Ihr dann oben einfügen:
#!/bin/bash
wait 1
/root/second/run.sh
In 2.sh würdet Ihr dann oben einfügen:
#!/bin/bash
wait 2
/root/second/run.sh
Endlosschleife
Eine Alternative hierzu wäre es anstatt eines Cronjobs am Ende des Shellskripts, das gleiche Shellskripts erneut aufzurufen und damit eine Endlosschleife zu erzeugen. Natürlich sollte das nicht als Cronjob ausgeführt werden, sondern unter einer Screen-Sitzung. Denn ansonsten hättet Ihr irgendwann eine große Anzahl von endlos ausgeführten Skripten. Anbei ein Beispiel zum Start einer Screen-Session
screen -mdS Endlos /root/endlosschleife.sh
Auch könnte es empfehlenswert sein eine kleine Verzögerung mit
wait 1
in das Shellskript einzubauen.
Schleife innerhalb 1 Minute
Eine weitere Alternative wäre es eine Schleife innerhalb einer Minute durchlaufen zu lassen. Wobei jeweils mind 1. Sekunde Abstand gehalten werden soll:
#! /bin/bash
end=$((SECONDS+58))
while [ $SECONDS -lt $end ]; do
# eigentliches Skript
sleep 1
:
done