Planen Sie einen Befehl so, dass er später ausgeführt wird?

87

Was ist ein einfacher Weg, um einen Befehl auszuführen, zum Beispiel in 8 Stunden? Ich kann mir das so vorstellen:

nohup bash -c "sleep 28800 ; ./mycommand.sh" &

Gibt es einen "angemesseneren" Weg?

Steve Bennett
quelle
Stimmt etwas mit nohup+ nicht sleep? Warum ist es "unpassend"?
cprn

Antworten:

123

Sie können den atBefehl verwenden. Die atAusführungsbefehle werden zu einem späteren Zeitpunkt ausgeführt. Das atDienstprogramm liest Befehle von der Standardeingabe und gruppiert sie als At-Job, um sie zu einem späteren Zeitpunkt auszuführen.

Wird normalerweise atstandardmäßig in Ubuntu installiert, aber wenn Ihre Version es nicht enthält, installieren Sie es über:

sudo apt-get install at

Weitere Informationen, Optionen, Beispiele und andere finden Sie im Ubuntu Manpage Repository

Beispiel:

at now +8 hours -f ~/myscript.sh

Sie können auch praktische Abkürzungen wie tomorrowoder noonwie in verwenden

echo "tweet fore" | at teatime 

Warnung: Dadurch wird der Befehl sofort links von der Pipe ausgeführt, die Ausgabe wird jedoch erst später angezeigt. Das Beispiel zeigt auch, wie Sie Aktionen weiterleiten könnenat. at -cAuf diese Weise können Sie geplante Aktionen untersuchen, die Sie bequem mit ihrer Nummer auflisten können, wie mit:

at -c 3
Mitch
quelle
19
Es kann hilfreich sein, ein einfaches Anwendungsbeispiel hinzuzufügen, das die Frage des ursprünglichen Posters genauer beantwortet, z. B.at now +8 hours -f ~/myscript.sh
steeldriver
6
Außerdem muss at 8:00der Befehl zu einem absoluten Zeitpunkt ausgeführt werden, und zwar batch"wenn der Computer im Leerlauf zu sein scheint"
Simon Richter,
4
Falls sich jemand wundert, teatimeist um 16 Uhr. Aus bestimmten Gründen wird es in manpages.ubuntu.com/manpages/raring/man1/at.1posix.html nicht erwähnt, aber in man atund hier in manpages.ubuntu.com/manpages/raring/en/man1/at.1.html .
Dan
3
Vielleicht können wir erwähnen, dass das "at" -Dienstprogramm nicht standardmäßig installiert ist und wenn jemand anderes es erhalten möchte, einfach das "at" -Paket installieren? Bearbeiten: Wie auch immer, ich habe einfach die Antwort bearbeitet (auch den Manpage-Link behoben).
heartsmagic
4
Beachten Sie, dass die Weiterleitung in at den Befehl sofort ausführt und nur die Ausgabe plant. Ich hatte einen 4-Stunden-3D-Druckfehler, weil ich einen Zeitplan erstellen wollte, der gpio write 8 1jedoch sofort ausgeführt wurde.
Maciej Swic
8

Ja, Sie können einen Cron-Job einstellen.

Wenn zum Beispiel jetzt 14:39:00 Uhr und heute Freitag, 30. August, ist, können Sie den folgenden Cron-Job (der nach 8 Stunden ausgeführt werden soll) mit dem crontab -eBefehl in Ihre crontab-Datei einfügen :

39 22 30 8 5  /path/to/mycommand.sh

Mehr über:

Radu Rădeanu
quelle
3
Ok, ja, ich hätte erwähnen sollen, dass ich etwas über Cron-Jobs weiß. Das ist noch chaotischer, weil es dann auf unbestimmte Zeit in der Crontab herumsteht, oder?
Steve Bennett
4
@ RaduRădeanu: mit Cron, vorsichtig, dass es in ein paar Jahren wieder feuern könnte (wenn ein weiterer 30. August an einem Freitag auftritt) ...
Olivier Dulac
2
Dies ist ein kluger Hack. "At" ist jedoch ein viel besserer Weg. Was würde passieren, wenn der Computer um 14:39 Uhr ausgeschaltet würde?
Emory
1
Ähm, das ist immer noch nicht mein Punkt. Mein Punkt ist, dass der von Ihnen eingegebene Text (glaube ich) nach dem Ereignis buchstäblich noch auf Ihrer Crontab sitzt und eine weitere Bereinigungsaufgabe für Sie erstellt.
Steve Bennett
2
@SteveBennett Ja, du bist richtig. Der Befehl bleibt in Ihrem Ordner, crontabbis Sie ihn entfernen. Ein Jahr später, wenn Sie vergessen haben, wer es dort abgelegt hat und warum, werden Sie sich am Kopf kratzen und sich fragen, was Sie mit dem Befehl anfangen sollen.
Paddy Landau
8

Verwenden Sie die Gnome-basierte GUI für cron, atund dergleichen:

Die Einführung des CronHowto schlägt vor, die GUI zu verwenden gnome-schedule, die viel netter ist, als den ganzen Müll in das Terminal zu tippen (besonders für "durchschnittliche" Ubuntu-Benutzer, die keine "Power" * nix / bsd-Benutzer sind).

Führen Sie es mithilfe von Unity Dash (oder eines anderen Anwendungsmenüs) aus, um nach geplanten Aufgaben zu suchen oder auszuführen gnome-schedule.

Auf Gnome-basierten Ubuntu-Systemen Gnome Scheduled Tasks Tool (aus dem gnome-schedule-Paket) in Applications -> System Tools bietet eine grafische Oberfläche mit Eingabeaufforderungen zur Verwendung von Cron. Die Projektwebsite befindet sich unter http://gnome-schedule.sourceforge.net/ ; Die Software kann über das Software Center oder durch Eingabe von installiert werden

sudo apt-get install gnome-schedule

in einem Terminal.

Wenn Sie gnome-schedulefür ein Skript in Ihrem Ausgangsverzeichnis einen neuen Befehl "at" verwenden, wird dieser Fenstertyp verwendet:

Bildbeschreibung hier eingeben

user29020
quelle
5

Ich fand einen schnellen und schmutzigen Weg, um dies zu tun, bevor ich herausfand, dass ates eine Sache war.

Angenommen, Sie möchten, dass Ihr Skript mittags ausgeführt wird:

until [[ "$(date)" =~ "12:00:" ]]; do
    sleep 10
done
./mycommand.sh

Angenommen, Sie möchten, dass es morgen mittag ausgeführt wird (heute ist der 24. November für mich):

until [[ "$(date)" =~ "25 12:00:" ]]; do 
    sleep 30
done
./mycommand.sh

Update : Etwas bessere Methode: Testen Sie nur die Zahlen, die Sie interessieren, mit date +FORMAT:

until [[ $(date +%H:%M) == 21:06 ]]; do
    ...
wjandrea
quelle
10
Um die beiden Personen , die diese Antwort upvoted haben, nutzen Sie bitte at, cronoder jede andere echte Scheduler - Anwendung. Die Aufgabenplanung ist schwierig und kein Rad, das Sie neu erfinden sollten.
dimo414
1
@ dimo414 Was ist los mit meiner Methode?
wjandrea
8
Zumindest ist es beschäftigt zu warten, was verschwenderisch ist. Schlimmer noch, es kann nicht garantiert werden, dass es korrekt ist. Es ist durchaus möglich (wenn auch unwahrscheinlich), dass die Bedingung nicht erfüllt wird. Es ist auch sehr fehleranfällig, Ihren Scheduler auf reguläre Ausdrücke zu stützen. Es mag gut genug funktionieren , hat aber keine Vorteile gegenüber at.
dimo414
(Abgesehen davon: Ich habe Ihre Antwort nicht abgelehnt, ich glaube nur nicht, dass die Leute sie verwenden sollten.)
dimo414
4
Ein weiterer Grund für die Verwendung atist, dass die Jobs einen Neustart überstehen.
Manatwork