Commands einmalig zeitgesteuert ausfuehren

Vorstellung eines nützlichen Tools zur einmaligen Ausführung definierter Commandlets.

Commands einmalig zeitgesteuert ausfuehren
Photo by Aron Visuals / Unsplash

? 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