GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Linux – Systemd Timeout, weil Daemon Forking nicht erkannt wird?

Ich entwickle derzeit einen systemd-Daemon. Das Problem, mit dem ich konfrontiert bin, ist, dass der Daemon 1:30 Sekunden nach dem Start beendet wird, weil die Verzweigung nicht erkannt wird.

Ich verwende den int daemon(int nochdir, int noclose) Funktion, um den Prozess zu dämonisieren.

int main()
{
    openlog("shutdownd", LOG_PID, LOG_DAEMON);

    if(daemon(0, 0) != 0)
    {
        syslog(LOG_ERR, "Error daemonizing process : %sn", strerror(errno));
        exit(EXIT_FAILURE);
    }
    syslog(LOG_NOTICE, "Daemon started !n");

    pthread_create(&threads[0], NULL, &alimThread, NULL);
    pthread_create(&threads[1], NULL, &extinctThread, NULL);
    pthread_create(&threads[2], NULL, &blinkThread, NULL);

    while(1)
    {
    }

    syslog(LOG_NOTICE, "Daemon stopped !n");
    exit(EXIT_SUCCESS);
}

Hier ist die Dienstdatei /etc/systemd/system/shutdownd.service

[Unit]
Description=Shutdown Daemon
After=syslog.target

[Service]
Type=forking
PIDFile=/var/run/shutdownd.pid
ExecStartPre=/bin/rm -f /var/run/shutdownd.pid
ExecStartPre=/usr/bin/shutdownd-exportGpio.sh
ExecStart=/usr/bin/shutdownd
Restart=on-abort

[Install]
WantedBy=multi-user.target

Die Daemon-Funktion soll den Prozess forken und vom Terminal trennen, ich schließe auch Dateideskriptoren und ändere das Arbeitsverzeichnis in /.

Systemd scheint die Verzweigung jedoch nicht zu erkennen, da es meinen laufenden Daemon nach 1:30 Sekunden beendet.

Sep  8 13:52:50 raspberrypi systemd[1]: shutdownd.service: PID file /var/run/shutdownd.pid not readable (yet?) after start: No such file or directory
Sep  8 13:52:50 raspberrypi shutdownd[293]: Daemon started !
Sep  8 13:52:50 raspberrypi shutdownd[293]: [Extinct] Value changed to 0
Sep  8 13:52:50 raspberrypi shutdownd[293]: OFF
Sep  8 13:52:50 raspberrypi shutdownd[293]: [Alim] Value changed to 0
Sep  8 13:52:50 raspberrypi shutdownd[293]: OFF
Sep  8 13:53:46 raspberrypi shutdownd[293]: [Alim] Value changed to 1
Sep  8 13:53:46 raspberrypi shutdownd[293]: Toogle : ON
Sep  8 13:53:48 raspberrypi shutdownd[293]: Toogle : OFF
[...]
Sep  8 13:54:16 raspberrypi shutdownd[293]: [Extinct] Value changed to 1
Sep  8 13:54:16 raspberrypi shutdownd[293]: ON
Sep  8 13:54:20 raspberrypi systemd[1]: shutdownd.service: Start operation timed out. Terminating.
Sep  8 13:54:20 raspberrypi systemd[1]: shutdownd.service: Unit entered failed state.
Sep  8 13:54:20 raspberrypi systemd[1]: shutdownd.service: Failed with result 'timeout'.

Hat jemand einen Hinweis darauf, warum systemd die Verzweigung nicht erkennt?

Muss ich explizit fork() aufrufen in meinem Code?
In diesem Fall muss ich die Daemonize-Funktion selbst programmieren, was nicht so schwierig, aber völlig nutzlos und überflüssig ist, da für diesen Zweck bereits eine C-Funktion existiert.

Akzeptierte Antwort:

Tu das nicht.

Überhaupt. Alles davon, entweder über eine Bibliotheksfunktion oder über Ihren eigenen Code. Für jedes Service-Management-System. Es ist seit den 1990er Jahren eine verkehrte Idee.

Ihr Dæmon ist bereits in einem Dienstkontext ausgeführt und auf diese Weise von einem Dienstverwalter aufgerufen. Ihr Programm sollte nichts tun insofern. Hören Sie überhaupt auf, Ihr Programm auf diese Weise zu schreiben.

Und verwenden Sie nicht das forking Bereitschaftsprotokoll. Ihr Programm ist multithreaded und wird mit ziemlicher Sicherheit nicht richtig funktionieren, wenn Sie versuchen, das forking hinzuzufügen Bereitschaftsprotokoll dazu, da das korrekte Erlassen des Protokolls eine Gabelung nach bedeutet Die gesamte Initialisierung wurde durchgeführt, einschließlich des Startens aller Threads. eigentlich fast nichts verwendet das forking Bereitschaftsprotokoll in freier Wildbahn. Verwenden Sie ein anderes Protokoll.

Verwandte:Linux – Wann sollte ich einen Prozess nicht mit -9 beenden?

Weiterführende Literatur

  • https://unix.stackexchange.com/a/200365/5132
  • https://unix.stackexchange.com/a/194653/5132
  • https://unix.stackexchange.com/a/211126/5132
  • https://unix.stackexchange.com/a/336067/5132
  • https://unix.stackexchange.com/a/283739/5132
  • Jonathan de Boyne Pollard (2001). „Don’t fork() um ‚den Dæmon in den Hintergrund zu stellen‘.“. Zu vermeidende Fehler beim Entwerfen von Unix-Dæmon-Programmen . Häufig gegebene Antworten.
  • Jonathan de Boyne Pollard (2015). Du brauchst wirklich nicht zu dämonisieren. Wirklich. . Das systemd House of Horror.
  • Jonathan de Boyne Pollard (2015). Readiness-Protokoll-Probleme mit Unix-Dämonen . Häufig gegebene Antworten.

Linux
  1. Aktualisieren Sie das Zeitlimit für das GRUB2-Menü unter RHEL 7 Linux

  2. Ersetzen von rc.local in systemd Linux-Systemen

  3. Hinzufügen eines neuen Dienstes zu Linux systemd

  4. Systemd Stop Job Timeout in der Nixos-Konfiguration ändern?

  5. Erkennen Sie Windows oder Linux in C, C++

Timeout-Befehl in Linux

Alles über Daemons in Linux

So ändern Sie das Sudo-Passwort-Timeout in Linux

So führen Sie Shell-Skript als SystemD-Dienst in Linux aus

Tutorial zur Verwendung des Timeout-Befehls unter Linux

Obarun – Eine Arch-basierte Linux-Distribution ohne Systemd