Cron
ist einer der bekanntesten UNIXismen der Computerwelt. Sogar IT-Leute, die keine Linux-Server administrieren, haben von dieser mysteriösen Bestie, dem „Cron-Job“, gehört. Und Linux-Administratoren wissen, dass Cron-Jobs unendlich nützlich sind. Tatsächlich kann man argumentieren, dass cron
System war ein früher Vorläufer des Automatisierungswahns. Wenn es etwas gibt, von dem Sie wussten, dass es ein Mensch vergessen könnte, cron
war die Antwort.
Wo jedoch cron
Excel ist Wiederholung, und manchmal muss ein Job nicht jede Stunde, jeden Tag oder jede Woche ausgeführt werden. Sie brauchen nur einen Job, der planmäßig ausgeführt wird, und das Einstellen eines Alarms, um sich selbst daran zu erinnern, scheint einfach nicht wie der UNIX-Weg zu sein. Was Sie brauchen, ist der at
Befehl, ein kleines Dienstprogramm, mit dem Sie eine Warteschlange mit Jobs erstellen können, die zur Ausführung um geplant sind zu einem bestimmten Zeitpunkt in der Zukunft.
Einrichtung
Vor der Verwendung von at
Befehl, müssen Sie ein Shell-Skript haben, das Sie irgendwann starten möchten. Wie üblich sollte Ihr Skript eine "Magic Cookie"- oder "Shebang"-Zeile am Anfang der Datei haben, um festzulegen, welche Shell für die Ausführung verwendet werden soll.
Erstellen Sie für dieses Beispiel ein einfaches Skript, das eine Datei darin erstellt /tmp
:
#!/bin/sh
DATE=`date --utc +%s`
echo "hello world $DATE" | tee /tmp/at.log
exit 0
Machen Sie das Skript ausführbar und testen Sie es dann:
$ chmod +x test.sh
$ ./test.sh
Zeigen Sie den Inhalt von /tmp/at.log
an Datei das erstellte Skript:
$ cat /tmp/at.log
hello world 1588482185
Job planen
Sie können einen Job mit einem Zeitstempel oder mit natürlicher Sprache planen. Wenn Sie natürliche Sprache oder einfache Zeitformate verwenden, ist vor der Angabe der Zeit keine Option erforderlich.
Zum Beispiel, um test.sh
zu planen zur sofortigen Ausführung können Sie einfach das Schlüsselwort now
verwenden :
$ at now -f test.sh
warning: commands will be executed using /bin/sh
job 1 at Mon Feb 24 01:23:00 2020
$ cat /tmp/at.log
hello world 1588482620
Sie können jetzt einen Offset festlegen mit minutes
, hours
, days
, weeks
, oder years
.
$ at now + 1 day -f test.sh
warning: commands will be executed using /bin/sh
job 2 at Tue Feb 25 01:27:00 2020
Die years
Schlüsselwort ist undokumentiert und seconds
wird nicht unterstützt. Sie können auch allgemeine Zeiten angeben, wie z. B. midnight
, noon
, und teatime
(das ist 16:00).
Einfache Zeiten funktionieren auch:
$ at 21:12 -f test.sh
warning: commands will be executed using /bin/sh
job 3 at Mon Feb 24 21:12:00 2020
Um ein Kalenderdatum zu einer bestimmten Zeit zu planen, müssen Sie das -t
verwenden Option und jedes POSIX-kompatible Zeitformat. Verwenden Sie beispielsweise das Format YYYYMMDDHHMM:
$ at -t 202003141509 -f test.sh
warning: commands will be executed using /bin/sh
job 4 at Sat Mar 14 15:09:00 2020
[ Suchen Sie nach fortschrittlicherer Systemautomatisierung? Beginnen Sie mit The Automated Enterprise, einem kostenlosen Buch von Red Hat. ]
Rohre
Sie können Befehle an at
senden über eine UNIX-Pipe:
$ echo "hello world" > /tmp/at.log | at now
warning: commands will be executed using /bin/sh
job 5 at Mon Feb 24 01:28:00 2020
$ cat /tmp/at.log
hello world
Batch-Jobs
Der batch
Befehl (oder at -b
) führt einen Befehl aus, sobald die Systemressourcen dies zulassen. Wenn Ihre Systemlast hoch ist, können Sie batch
verwenden um Ihren Job in die Warteschlange einzureihen, damit er ausgeführt wird, wenn CPU-Zyklen übrig sind.
$ echo "Cycles to spare" > /tmp/at.log | batch
warning: commands will be executed using /bin/sh
job 5 at Mon Feb 24 01:31:00 2020
Anzeigen Ihrer Warteschlange
Der atq
Befehl zeigt Ihren at
an Warteschlange. Dies gibt Ihnen die Job-ID, die Zeit, zu der jeder Job ausgeführt werden soll, die Warteschlange, in der jeder Job gruppiert ist (a
für at
Warteschlange oder b
für den batch
Warteschlange) und den Benutzernamen des Eigentümers der Warteschlange. Der Eigentümer der Warteschlange sind normalerweise Sie selbst, es sei denn, Sie führen atq
aus als root, in diesem Fall sehen Sie alle Benutzer at
Warteschlangen.
$ atq
2 Tue Feb 25 01:27:00 2020 a seth
3 Mon Feb 24 21:12:00 2020 a seth
4 Sat Mar 14 15:09:00 2020 a seth
5 Mon Feb 24 01:31:00 2020 b seth
Sie können Ihre eigenen Warteschlangen mit einem beliebigen einzelnen Zeichen c-z erstellen und benennen oder A-Z . Sowohl a
und b
sind reservierte Bezeichnungen für at
und batch
, und jede Warteschlange mit einem Großbuchstaben wird als batch
behandelt Arbeit. Warteschlangen mit Namen, die alphabetisch auf a
folgen und b
werden mit zunehmender Freundlichkeit betrieben.
Vorschau Ihres Auftrags anzeigen
Wenn Sie einen Befehl oder ein Skript an at
senden , Ihr aktuelles Arbeitsverzeichnis, Umgebung (außer BASH_VERSINFO
, DISPLAY
, EUID
, GROUPS
, SHELLOPTS
, TERM
, UID
, und _
) und die umask bleiben erhalten. Wenn Ihr Befehl bestimmte Umgebungseinstellungen erwartet, sollten Sie diese festlegen, während Sie den Befehl an at
übergeben oder überschreiben Sie sie in Ihrem Skript.
Um zu sehen, wie Ihr Befehl ausgeführt wird, verwenden Sie -c
Option zusammen mit der Auftragsnummer:
$ at -c 4
#!/bin/sh
# atrun uid=1006 gid=1006
# mail seth 0
umask 22
CPLUS_INCLUDE_PATH=/usr/lib64/qt/include; export CPLUS_INCLUDE_PATH
MANPATH=/usr/local/man:/usr/man:/usr/lib64/adoptopenjdk12.0.2/man; export MANPATH
KDE_MULTIHEAD=false; export KDE_MULTIHEAD
[...]
Jobs entfernen
Sie können ausstehende Jobs von Ihrem at
entfernen Warteschlange mit dem atrm
Befehl und die Job-ID. Wenn Sie die Job-ID nicht kennen, verwenden Sie atq
, um zuerst Ihre Warteschlange anzuzeigen.
$ atq
6 Fri Jan 01 00:00:00 2038 a seth
$ atrm 6
$ atq
Terminierung mit at
Der at
Befehl ist ein bisschen wie ein kleinerer cron
System. Es ist nützlich für die einmalige Ausführung von Befehlen und einfach zu verwenden. Wenn Sie cron
verwendet haben oder sleep
Um die Ausführungszeit eines Befehls auszugleichen, werfen Sie einen Blick auf at
und batch
.
[ Möchten Sie mehr über die Linux-Systemadministration erfahren? Erwägen Sie die Teilnahme an einem Red Hat Systemadministrationskurs. ]