GNU/Linux >> Tutoriels Linux >  >> Linux

Linux - Systemd Timeout parce qu'il ne détecte pas Daemon Forking ?

Je développe actuellement un démon systemd. Le problème auquel je suis confronté est que le démon est tué 1m30s après avoir été lancé car le forking n'est pas détecté.

J'utilise le démon int daemon(int nochdir, int noclose) fonction pour démoniser le processus.

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);
}

Voici le fichier de service /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

La fonction démon est censée bifurquer le processus et le détacher du terminal, je ferme également les descripteurs de fichiers et change le répertoire de travail en /.

Cependant, systemd ne semble pas détecter le forking car il tue mon démon en cours d'exécution après 1m30.

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'.

Quelqu'un a-t-il une idée de la raison pour laquelle systemd ne détecte pas le forking ?

Dois-je appeler explicitement fork() dans mon code ?
Dans ce cas, je vais devoir coder moi-même la fonction démonize, ce qui n'est pas si difficile mais totalement inutile et redondant puisqu'une fonction c existe déjà à cet effet.

Réponse acceptée :

Ne faites pas ça.

Du tout. N'importe lequel, soit via une fonction de bibliothèque, soit en lançant votre propre code. Pour tout système de gestion de service. C'est une idée erronée depuis les années 1990.

Votre démon est déjà s'exécutant dans un contexte de service, invoqué de cette façon par un gestionnaire de service. Votre programme ne doit rien faire à cet égard. Arrêtez du tout d'écrire votre programme de cette façon.

Et n'utilisez pas le forking protocole de préparation. Votre programme est multithread et ne fonctionnera certainement pas correctement si vous essayez d'ajouter le forking protocole de préparation à celui-ci, car l'adoption correcte du protocole signifie bifurquer après toute l'initialisation a été effectuée, y compris le démarrage de tous les threads. Presque rien en fait utilise le forking protocole de préparation dans la nature. Utilisez un autre protocole.

Connexe :Linux – Quand ne dois-je pas tuer -9 un processus ?

Autres lectures

  • 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). "Ne bifurquez pas () afin de" mettre le dæmon en arrière-plan ".". Erreurs à éviter lors de la conception de programmes dæmon Unix . Réponses fréquemment données.
  • Jonathan de Boyne Pollard (2015). Vous n'avez vraiment pas besoin de démoniser. Vraiment. . La maison de l'horreur systemd.
  • Jonathan de Boyne Pollard (2015). Problèmes de protocole de préparation avec les dæmons Unix . Réponses fréquemment données.

Linux
  1. Comprendre systemd au démarrage sous Linux

  2. Linux - Emplacement du script Fsck ?

  3. Service d'exploitation Linux "sshd"

  4. Forkation plus rapide des gros processus sous Linux ?

  5. Détecter Windows ou Linux en C, C++

Commande de temporisation sous Linux

Tout sur les démons sous Linux

Comment changer le délai d'expiration du mot de passe Sudo sous Linux

Comment exécuter un script Shell en tant que service SystemD sous Linux

Tutoriel sur l'utilisation de la commande Timeout sous Linux

Obarun - Une distribution Linux basée sur Arch sans Systemd