
Ich habe ein Skript mit einer „while true“-Schleife. Und ich möchte dieses Skript jede Minute von cron ausführen, sodass cron das Skript erneut ausführt, wenn der Prozess beendet wird (oder fehlschlägt – egal warum).
Aber wenn ich nachschaue, ps -aef --forest
wird mein Prozess von ausgeführt /usr/sbin/CROND -n
. Das wäre weder für Cron noch für das System schlecht? Oder sollte ich es vielleicht anders machen?
Antwort1
systemd
Vielleicht reicht ein kurzes Beispiel für einen Dienst.
Dies ist unser unendliches Skript, Speicherort /path/to/infinite_script
, ausführbares Bit gesetzt:
#!/bin/bash
while ((1)) ; do
date >> /tmp/infinite_date
sleep 2
done
Nein, wir müssen eine Servicedatei definieren:
[Unit]
#just what it does
Description= infinite date service
[Service]
#not run by root, but by me
User=fiximan
#we assume the full service as active one the script was started
Type=simple
#where to find the executable
ExecStart=/path/to/infinite_script
#what you want: make sure it always is running
Restart=always
[Install]
#which service wants this to run - default.target is just it is loaded by default
WantedBy=default.target
und legen Sie es in/etc/systemd/system/infinite_script.service
Laden und starten Sie nun den Dienst (als Root):
systemctl enable infinite_script.service
systemctl start infinite_script.service
Der Dienst läuft jetzt und wir können seinen Status überprüfen
systemctl status infinite_script.service
● infinite_script.service - infinite date service
Loaded: loaded (/etc/systemd/system/infinite_script.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2019-05-28 14:18:52 CEST; 1min 33s ago
Main PID: 7349 (infinite_script)
Tasks: 2 (limit: 4915)
Memory: 1.5M
CGroup: /system.slice/infinite_script.service
├─7349 /bin/bash /path/to/infinite_script
└─7457 sleep 2
Mai 28 14:18:52 <host> systemd[1]: Started infinite date service.
Wenn Sie jetzt das Skript beenden ( kill 7349
- Haupt-PID) und den Status erneut überprüfen:
● infinite_script.service - infinite date service
Loaded: loaded (/etc/systemd/system/infinite_script.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2019-05-28 14:22:21 CEST; 12s ago
Main PID: 7583 (infinite_script)
Tasks: 2 (limit: 4915)
Memory: 1.5M
CGroup: /system.slice/infinite_script.service
├─7583 /bin/bash /path/to/infinite_script
└─7606 sleep 2
Mai 28 14:22:21 <host> systemd[1]: Started infinite date service.
Beachten Sie, dass es sofort mit einer neuen PID neu gestartet wurde.
Und überprüfen Sie den Dateibesitz der Ausgabe:
ls /tmp/infinite/date
-rw-r--r-- 1 fiximan fiximan 300 Mai 28 14:31 infinite_date
Damit wird das Skript vom richtigen Benutzer ausgeführt, der in der Servicedatei festgelegt ist.
Natürlich können Sie den Dienst stoppen und deaktivieren:
systemctl stop infinite_script.service
systemctl disable infinite_script.service
BEARBEITEN:
Noch ein paar Details: Die persönlichen Dienste eines Benutzers können (standardmäßig) in platziert $HOME/.config/systemd/user/
und entsprechend verwaltet werden systemctl --user <commands>
. Wie bei einer persönlichen Crontab ist kein Root erforderlich.
Antwort2
mu.
cron ist für diese Aufgabe das falsche Werkzeug.
Das richtige Werkzeug ist einService Manager, außerdem einer, der die Idee des automatischen Neustarts von Diensten nach ihrer Beendigung beinhaltet. (Das ist nicht bei allen der Fall.) Zu solchen Dienstmanagern gehören:
- Dan Bernsteinsdaemontools
- Adam Sampsonsfrei
- Bruce Guentersdaemontools-zur-zugabe
- Laurent Bercotss6
- Gerrit Papesstarte es
- Wayne MarshallsTäter
- launchd (nur MacOS)
- systemd (nur Linux)
- fscd (nur FreeBSD)
- beaufsichtigt
- MeinLeckereien
Man erstellt eine für den Service-Manager geeignete Service-Definition, die das Endlosschleifen-Skript ausführt, und fügt es hinzu. Für einige Service-Manager ist das einfach ein kleines run
Programm (normalerweise selbst ein Skript), das das Endlosschleifen-Skript ausführt. Die Service-Manager übernehmen das Starten, Überwachen und den automatischen Neustart.
Einige der Service-Manager lassen sich problemlos für die benutzerspezifische und systemweite Dienstverwaltung einsetzen. Sie können dies als benutzerspezifische Dienstdefinition eines Dienstes einrichten, der unter dem eigenen Konto ausgeführt wird und ohne Superuser-Berechtigungen (die für die Verwaltung systemweiter Dienste erforderlich sind) verwaltet werden kann.
Weiterführende Literatur
- Joshua Timberman (29.12.2012).Prozessüberwachung: Gelöstes Problem.
- Larry Doolittle (23.06.2005).Unix Daemon-Grundlagen.
- Jonathan de Boyne Pollard (2015).Die Daemontools-Familie. Häufig gestellte Fragen.
- Stellen Sie sicher, dass ein Prozess immer ausgeführt wird
- So starten Sie einen Prozess automatisch neu, wenn er unter Linux/CentOS beendet wurde
Antwort3
@FelixJN
Ein Vorbehalt: Das Einschalten von Selinux kann dazu führen, dass Ihr Skript nicht mehr ausgeführt wird. Um es zum Laufen zu bringen,
habe es dorthin verschoben
/usr/local/bin
(ein Ordner, der von Selinux unterstützt wird)und
/etc/systemd/system/infinite_script.service
entsprechendExecStart
bearbeitetran,
sudo restorecon -rv /usr/local/bin
um diese Informationen an selinux zu übermitteln undrannte
systemctl daemon-reload
endlichStarten Sie den Dienst neu
systemctl start infinite_script.service