
Ich habe den folgenden Code in meiner root
Crontab auf meinem Debian
* * * * * flock -xn /absolute/path/to/run.lock -c cd /absolute/parth/to/project && ./run >> run.log
Aber ich sehe keine run.log
oder run.lock
Dateien, wo ich sie angebe. Tatsächlich gibt es keinen Beweis dafür, dass das Skript ausgeführt wurde.
ps aux | grep run
Nur das Ausführen führt zu diesem grep
Aufruf.
Wie führe ich das run
Skript flock
im Stammverzeichnis aus crontab
?
Antwort1
Der Befehl in der Crontab-Zeile wird nicht wie erwartet analysiert.
Der Cron-Daemon führt den Befehl mithilfe der für den betreffenden Benutzer konfigurierten Shell aus.
Diese erste Shell sieht zwei Befehle, die durch den &&
Kontrolloperator getrennt sind. Der zweite Befehl wird also nur ausgeführt, wenn der erste Befehl mit einem Null-Rückgabecode beendet wird, was auf Erfolg hinweist.
Der erste Befehl lautet: flock -xn /absolute/path/to/run.lock -c cd /absolute/path/to/project
.
Der zweite Befehl lautet: ./run >> run.log
.
Der erste Befehl erstellt die Sperrdatei und führt den Befehl cd
als untergeordneten Prozess aus, d. h. in einer anderen Instanz der Shell. Der cd
Befehl ohne Argumente wechselt in das Home-Verzeichnis des Benutzers, woraufhin die von ihm ausgeführte Shell flock
sofort beendet wird. Dies hat im Endeffekt überhaupt keine Auswirkungen.
Selbst mit dem Pfadnamen cd /absolute/path/to/project
hätte der Befehl hier keinerlei Auswirkungen auf das Arbeitsverzeichnis des flock
Befehls oder des zweiten Befehls, der von der ersten Instanz der Shell ausgeführt wird.Dies liegt daran, dass der cd
Befehl nur die spezifische Shell-Instanz beeinflusst, in der er ausgeführt wird, nicht aber deren übergeordnete Instanzen.
Dies /absolute/path/to/project
wird als zusätzlicher Dateiname für den flock
Befehl behandelt, nicht als Parameter für cd
.
cron
Da der erste Befehl beendet wurde und keine Fehler gemeldet hat, führt die erste Instanz der Shell (ursprünglich vom Daemon initiiert ) nun den zweiten Befehl aus. Da sich das Arbeitsverzeichnis dieser Shell nicht geändert hat, ist es immer noch das Home-Verzeichnis des root
Benutzers, sodass letztendlich versucht wird, das auszuführen, was tatsächlich /root/run >>/root/run.log
.
Ich vermute, dass Sie wahrscheinlich so etwas meinten:
* * * * * flock -xn /absolute/path/to/run.lock -c "cd /absolute/path/to/project && ./run >> run.log"
Die Anführungszeichen verhindern, dass die erste Shell die Befehlszeile bei aufteilt &&
. Dadurch flock
erhält die zweite Shell (die durch den Befehl gestartet wurde) die gesamte verbleibende Befehlszeile, sodass der Befehl vor der Ausführung im Projektverzeichnis cd /absolute/path/to/project
sinnvoll ausgeführt wird ../run