GNU/Linux >> Tutoriales Linux >  >> Linux

Linux:¿tiempo de espera de Systemd porque no detecta la bifurcación de Daemon?

Actualmente estoy desarrollando un demonio systemd. El problema al que me enfrento es que el daemon muere 1m30s después de ser lanzado porque no se detecta la bifurcación.

Estoy usando el int daemon(int nochdir, int noclose) función para demonizar el proceso.

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

Aquí está el archivo de servicio /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

Se supone que la función daemon bifurca el proceso y lo desconecta de la terminal, también cierro los descriptores de archivos y cambio el directorio de trabajo a /.

Sin embargo, parece que systemd no detecta la bifurcación, ya que mata a mi demonio en ejecución después de 1 minuto y 30 segundos.

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

¿Alguien tiene una pista sobre por qué systemd no detecta la bifurcación?

¿Tengo que llamar explícitamente a fork()? en mi código?
En este caso, tendré que codificar la función daemonize yo mismo, lo cual no es tan difícil pero es totalmente inútil y redundante ya que ya existe una función c para ese propósito.

Respuesta aceptada:

No hagas eso.

En absoluto. Cualquiera de ellos, ya sea a través de una función de biblioteca o rodando su propio código. Para cualquier sistema de gestión de servicios. Ha sido una idea equivocada desde la década de 1990.

Tu demonio ya ejecutándose en un contexto de servicio, invocado de esa manera por un administrador de servicios. Su programa no debería hacer nada a este respecto. Deja de escribir tu programa de esa manera.

Y no uses el forking protocolo de preparación. Su programa tiene varios subprocesos y es casi seguro que no funcionará correctamente si intenta agregar el forking protocolo de preparación, ya que promulgar el protocolo correctamente significa bifurcarse después se ha realizado toda la inicialización, incluida la puesta en marcha de todos los subprocesos. Casi nada en realidad usa la forking protocolo de preparación en la naturaleza. Utilice otro protocolo.

Relacionado:Linux:¿cuándo no debo eliminar -9 un proceso?

Lecturas adicionales

  • 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). "No bifurcar() para 'poner el demonio en segundo plano'.". Errores a evitar al diseñar programas daemon Unix . Respuestas frecuentes.
  • Jonathan de Boyne Pollard (2015). Realmente no necesitas demonizar. De verdad. . El sistema House of Horror.
  • Jonathan de Boyne Pollard (2015). Problemas de protocolo de preparación con demonios Unix . Respuestas frecuentes.

Linux
  1. Comprender systemd al inicio en Linux

  2. Cómo crear un servicio Systemd en Linux

  3. Agregar un nuevo servicio a Linux systemd

  4. Cómo enumerar los servicios de Systemd en Linux

  5. Detectar Windows o Linux en C, C++

Comando de tiempo de espera en Linux

Todo sobre Daemons en Linux

Cómo cambiar el tiempo de espera de la contraseña de Sudo en Linux

Cómo ejecutar Shell Script como servicio SystemD en Linux

Tutorial sobre el uso del comando Timeout en Linux

Obarun:una distribución de Linux basada en Arch sin Systemd