Wie führe ich einen Cron Job nur einmal aus?

14

Ich habe einen Job, der für immer läuft, sobald er anfängt. Ich möchte es also nur einmal starten, nachdem ich es in die "crontab -e" -Datei eingegeben und bei jedem Neustart gespeichert habe (oder).

Wie kann man das erreichen?

Rama Vadakattu
quelle

Antworten:

22

Wenn Sie einen Befehl ausführen möchten einmal zu einem späteren Zeitpunkt, verwenden Sie den atBefehl.

Wenn Sie möchten, dass ein Befehl beim Systemstart einmal ausgeführt wird, verwenden Sie entweder:

  • System-RC-Skripte (/etc/rc.local)
  • crontab mit dem @rebootspeziellen Präfix (siehe Manpage)

Letzteres ist die einzige Option für einen Benutzer ohne Rootberechtigung.

MikeyB
quelle
2
+1 für die Erwähnung von @reboot.
Alex Holst
Ich würde es immer vorziehen, wenn möglich /etc/rc.local zu verwenden ... Ich vermute, dass @reboot tatsächlich Befehle beim Crond-Start ausführt, nicht beim Systemstart. Subtiler aber möglicher Unterschied.
MikeyB
Angenommen, ich habe @reboot "cmd ............." in die crontab-Datei eingegeben und gespeichert. Wird dieser Befehl jetzt gestartet? (oder) Startet es erst nach dem Neustart?
Rama Vadakattu
Probieren Sie es aus und sehen Sie :) Sie müssen es wahrscheinlich in crontab at now
ablegen
Gute Antwort. Ich vergesse immer @reboot.
Bill Weiss
9

Sie können at (1) verwenden, um einen Auftrag zu einem späteren Zeitpunkt auszuführen. Wenn Sie jedoch etwas beim Booten ausführen möchten und es weiterhin von selbst ausgeführt wird, möchten Sie möglicherweise einen Eintrag in /etc/init.d/ dafür? Dann können Sie es beim Booten starten.

Bill Weiss
quelle
1
Sie könnten auch rc.local verwenden. Die Befehle in /etc/rc.local "werden nach allen anderen Init-Skripten ausgeführt. Sie können Ihre eigenen Initialisierungs-Informationen in rc.local ablegen, wenn Sie nicht die vollständigen Init-Informationen im Sys V-Stil ausführen möchten."
Joe
Joe: Guter Anruf.
Bill Weiss
Wie kann ich den Prozess stoppen, der von at command gestartet wurde? (Ich weiß, Prozess-ID töten, nachdem Liste der Prozess-IDs mit "ps Befehl" angezeigt wurde. Funktioniert dies auch für "at Befehl". Ist das Erstellen von benutzerdefinierten Skripten einfach?
Rama Vadakattu
Ja zu beiden. Alle Prozesse können gestoppt werden kill(vorausgesetzt, Sie haben die entsprechenden Berechtigungen, die Sie für Ihre eigenen Prozesse ausführen). Das Erstellen eines Init-Skripts ist wirklich einfach. Suchen Sie /etc/init.d/nach einem Skript, das nicht sehr lang ist, und orientieren Sie sich daran, oder suchen Sie bei Google nach making init scripts (your distribution).
Bill Weiss
1
Viele Distributionen enthalten ein Skelett-Skript ( /etc/init.d/skeletonunter openSuSE), das Sie für Ihre Verwendung anpassen können.
MikeyB
3

Ein Job, der nur einmal ausgeführt wird und für immer ausgeführt wird, bis Sie ihn zum Sterben bringen, wird als "Daemon" bezeichnet. Sie werden normalerweise über Init-Skripte in /etc/init.d/ gestartet.

Wenn Ihr Job irgendwann endet und als einmaliger Job angesehen werden kann, sollten Sie sich den Befehl at ansehen. Wenn ich zum Beispiel heute Abend um 22 Uhr den Befehl find ausführen wollte und dies nur einmal tun würde:

$ at 10PM
at> find /root > /root/find_results.list
at> <EOT>
job 3 at 2010-02-10 22:00
Carpe Noctem
quelle
1

Schauen Sie sich den Befehl at an

Dominik
quelle
Was passiert, wenn das System neu gestartet wird? Muss ich erneut "at command" eingeben?
Rama Vadakattu
Die at-Befehlseinträge gehen bei jedem Neustart nicht verloren. ibm.com/developerworks/linux/library/l-job-scheduling.html ist eine interessante Einführung in die Job - Scheduling
Dominik
@ Rama Vadakattu: "Die at-Befehlseinträge gehen bei Neustarts nicht verloren." ... die noch nicht ausgeführt wurden. Siehe MikeyBs Antwort.
Bis auf weiteres angehalten.
ok, ich werde mehr darüber recherchieren.
Rama Vadakattu