mu.

mu.

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 --forestwird 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

systemdVielleicht 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:

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 runProgramm (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

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,

  1. habe es dorthin verschoben /usr/local/bin(ein Ordner, der von Selinux unterstützt wird)

  2. und /etc/systemd/system/infinite_script.serviceentsprechend ExecStartbearbeitet

  3. ran, sudo restorecon -rv /usr/local/binum diese Informationen an selinux zu übermitteln und

  4. rannte systemctl daemon-reloadendlich

  5. Starten Sie den Dienst neusystemctl start infinite_script.service

verwandte Informationen