Commands einmalig zeitgesteuert ausfuehren
Vorstellung eines nützlichen Tools zur einmaligen Ausführung definierter Commandlets.
? Aufgabe
Um wiederkehrende Tasks auszuführen, eignet sich Crontab. Was aber, wenn ein Befehl lediglich einmalig zu einer festgelegten Zeit ausgeführt werden soll?
Beispielsweise der geplante Neustart eines Rechners um 05:00 Uhr morgens.
! Lösung
Für die einmalige Ausführung eines Befehls oder Skriptes eignet sich das Programm »at«.
Installation
Die Installation erfolgt über den apt Paketmanager:
apt install at
Im Anschluss muss der Daemon noch gestartet werden, damit At im Hintergrund läuft:
sudo systemctl enable --now atd
Verwendung
Die Syntax des Programms ist simpel:
at [option] runtime
Um einen Task zu planen, gibt man lediglich nachstehenden Befehl ein:
at now + 10 hours
Im Anschluss daran erscheint folgender Dialog:
warning: commands will be executed using /bin/sh
at>
Hinter »at>« wird der Befehl abgesetzt welcher in 10 Stunden ausgeführt werden soll.
Mit »Strg + D« wird der Vorgang gespeichert und der Dialog verlassen.
Hinweis: Werden für den geplanten Job Administrator Rechte benötigt, kann beim Erstellen wie gewohnt das »sudo« vorangestellt werden.
Einlesen von Befehlen aus Textdatei
at now + 10 hours < commands.txt
›At‹ unterstützt auch Einzeiler, diese Befehle müssen jedoch passend übergeben werden.
Auflisten bestehender Tasks
Um geplante Tasks aufzulisten genügt das Absetzen einer der folgenden Befehle:
[sudo] atq
# oder
[sudo] at -l
Job Details auslesen
Mittels »atq« werden alle Jobs gelistet, wenn die »job_number«, also die erste Zahl notiert wird, kann im Nachgang der geplante Job angeschaut werden:
# Jobs auflisten
atq
# Job Details auslesen
at -c job_number
Geplante Jobs Abbrechen/Entfernen/Löschen
Um einen geplanten Job zu entfernen, lassen wir uns zunächst alle Jobs ausgeben und entfernen im Anschluss den Job unter Angabe der »job_number«.
# Jobs auflisten
atq
# Job entfernen
atrm job_number
Um Alle geplanten Jobs zu entfernen kann dieses Code-Snippet benutzt werden:
for i in `atq | awk '{print $1}'`;do atrm $i;done
Beispiele
Anbei ein paar Beispiele zur Verwendung von »at«.
bash now + 1 minute
now + 10 minutes
now + 1 hour
now + 10 days
now + 1 week
now + 1 months
now + 1 year 5 AM + 1 day
tomorrow # now + 24h