Systemd timeout porque não detecta daemon bifurcando

1

Atualmente estou desenvolvendo um daemon systemd. O problema que estou enfrentando é que o daemon é morto 1m30s após ser lançado porque o forking não é detectado.

Estou usando a função int daemon(int nochdir, int noclose) para daemonizar o processo.

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

    if(daemon(0, 0) != 0)
    {
        syslog(LOG_ERR, "Error daemonizing process : %s\n", 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);
}

Aqui está o arquivo de serviço /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

A função daemon deve separar o processo e desconectá-lo do terminal, eu também fecho os descodificadores de arquivos e mudo o diretório de trabalho para /.

No entanto, o systemd parece não detectar o bifurcado, já que ele mata o daemon em execução após 1m30s.

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

Alguém tem a menor idéia de por que o systemd não detecta o bifurcação?

Eu preciso chamar explicitamente fork() no meu código? Neste caso, eu terei que codificar a função daemonize sozinha, o que não é tão difícil, mas totalmente inútil e redundante, já que uma função c já existe para esse propósito.

    
por Arkaik 31.10.2017 / 11:41

1 resposta

4

Não faça isso.

Em tudo. Qualquer um deles, seja através de uma função de biblioteca ou rolando seu próprio código. Para qualquer sistema de gerenciamento de serviços. Tem sido uma ideia equivocada desde os anos 90.

Seu daemon já está em execução em um contexto de serviço, chamado dessa maneira por um gerenciador de serviços. Seu programa deve não fazer nada a esse respeito. Pare de escrever seu programa dessa maneira.

E não use o protocolo de prontidão forking . Seu programa é multithreaded e quase certamente não funcionará corretamente se você tentar adicionar o protocolo forking readiness, já que aprovar corretamente o protocolo significa bifurcar após toda a inicialização, incluindo a inicialização de todos dos segmentos. Quase nada realmente usa o protocolo de prontidão forking no estado selvagem. Use outro protocolo.

Leitura adicional

por 31.10.2017 / 13:27