it-swarm.com.de

"Richtige" Möglichkeit, Shell-Skript als Daemon auszuführen

Ich schreibe ein Shell-Skript , das ich beim Start als Daemon ausführen möchte ohne externe Tools wie daemontools oder daemonize.


Linux Daemon Writing HOWTO

Gemäß dem Linux Daemon Writing HOWTO hat ein richtig Daemon die folgenden Eigenschaften:

  • gabelt aus dem übergeordneten Prozess
  • schließt alle Dateideskriptoren (dh stdin, stdout, stderr)
  • öffnet Protokolle zum Schreiben (falls konfiguriert)
  • ändert das Arbeitsverzeichnis in ein dauerhaftes (normalerweise /)
  • setzt die Dateimodusmaske zurück (umask)
  • erstellt eine eindeutige Sitzungs-ID (SID)

daemonize Einführung

Die Daemonize Introduction geht weiter und besagt, dass ein typischer Daemon auch:

  • trennt sich von seinem Steuerterminal (falls vorhanden) und ignoriert alle Terminalsignale
  • trennt sich von seiner Prozessgruppe
  • behandelt SIGCLD

Wie würde ich das alles in einem sh -, dash - oder bash - Skript nur mit gängigen Linux-Tools tun?

Das Skript sollte auf so vielen Distributionen wie möglich ohne zusätzliche Software ausgeführt werden können, obwohl Debian unser Hauptaugenmerk ist.


HINWEIS: Ich weiß, dass es im StackExchange Netzwerk viele Antworten gibt, die die Verwendung von Nohup empfehlen. oder setsid, aber keine dieser Methoden erfüllt alle oben genannten Anforderungen.


EDIT: Die Manpage Daemon (7) gibt auch einige Hinweise, obwohl es einige Unterschiede zu geben scheint zwischen älteren SysV Dämonen und neueren systemd Dämonen. Da die Kompatibilität mit einer Vielzahl von Distributionen wichtig ist, stellen Sie bitte sicher, dass die Antwort alle Unterschiede deutlich macht.


25
user339676

Mit systemd sollten Sie in der Lage sein, ein Skript als Daemon auszuführen, indem Sie eine einfache Einheit erstellen. Es gibt viele verschiedene Optionen , die Sie hinzufügen können, aber dies ist so einfach wie möglich.

Angenommen, Sie haben ein Skript /usr/bin/mydaemon.

#!/bin/sh

while true; do
  date;
  sleep 60;
done

Sie erstellen eine Einheit /etc/systemd/system/mydaemon.service.

[Unit]
Description=My daemon

[Service]
ExecStart=/usr/bin/mydaemon
Restart=on-failure

[Install]
WantedBy=multi-user.target 

Um den Dämon zu starten, rennst du

systemctl start mydaemon.service 

Um beim Booten zu beginnen, aktivieren Sie es

systemctl enable mydaemon.service

Wenn auf einem systemd-basierten System, wie es heute die Mehrheit der Linux-Distributionen ist, ist dies kein externes Tool. Das Negative wäre, dass es nicht überall funktionieren wird.

21
johnramsden

Mir fehlt hier wahrscheinlich etwas; warum genau wäre Nohup nicht angemessen? Natürlich ist es nicht genug allein, aber es zu ergänzen scheint einfach zu sein.

#!/bin/bash

if [ "$1" = "DAEMON" ]; then
    # is this necessary? Add other signals at will (TTIN TTOU INT STOP TSTP)
    trap '' INT
    cd /tmp
    shift
    ### daemonized section ######
    for i in $( seq 1 10 ); do
        date
        sleep 5
    done
    #### end of daemonized section ####
    exit 0
fi

export PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/sbin:/usr/local/bin
umask 022
# You can add Nice and ionice before Nohup but they might not be installed
Nohup setsid $0 DAEMON $* 2>/var/log/mydaemon.err >/var/log/mydaemon.log &

Soweit ich das beurteilen kann:

  • die Ausgabe wird entsprechend umgeleitet (ggf./dev/null verwenden).
  • die Umask wird vererbt
  • stdin stirbt jedoch am Ende des übergeordneten Skripts
  • das Skript daemon.sh wird auf init (oder systemd) repariert.

Ich habe das starke Gefühl, das Offensichtliche zu vermissen. Downvote, aber bitte sag mir was es ist :-)

7
LSerni

Der in den meisten Distributionen enthaltene Linux-Befehl screen kann ein Shell-Skript dämonisieren. Ich benutze es oft. Hier ist ein kurzes Beispiel zum Starten, Auflisten und Beenden einer getrennten Bildschirmsitzung ...

# screen -dmS Session_Name  bash -c "while true; do date; sleep 60; done"

# screen -ls
There are screens on:
        8534.Session_Name       (04/04/2018 08:46:27 PM)        (Detached)

# screen -S Session_Name -X quit
4
S.Haran