GNU/Linux >> Linux Esercitazione >  >> Linux

Linux:timeout di Systemd perché non rileva il fork del demone?

Attualmente sto sviluppando un demone systemd. Il problema che sto affrontando è che il demone viene ucciso 1 minuto e 30 secondi dopo essere stato lanciato perché il fork non viene rilevato.

Sto usando il int daemon(int nochdir, int noclose) funzione per demonizzare il processo.

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

Ecco il file di servizio /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 funzione demone dovrebbe eseguire il fork del processo e staccarlo dal terminale, inoltre chiudo i descrittori di file e cambio la directory di lavoro in /.

Tuttavia systemd sembra non rilevare il fork poiché uccide il mio demone in esecuzione dopo 1 minuto e 30 secondi.

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

Qualcuno ha un indizio sul motivo per cui systemd non rileva il fork?

Devo chiamare esplicitamente fork() nel mio codice?
In questo caso dovrò codificare da solo la funzione daemonize che non è così difficile ma totalmente inutile e ridondante poiché esiste già una funzione c per quello scopo.

Risposta accettata:

Non farlo.

Affatto. Qualsiasi cosa, tramite una funzione di libreria o rotolando il tuo codice. Per qualsiasi sistema di gestione dei servizi. È stata un'idea sbagliata sin dagli anni '90.

Il tuo daimon è già in esecuzione in un contesto di servizio, invocato in questo modo da un gestore di servizi. Il tuo programma non dovrebbe fare nulla nel rispetto. Smetti di scrivere il tuo programma in questo modo.

E non utilizzare il forking protocollo di prontezza. Il tuo programma è multithread e quasi sicuramente non funzionerà correttamente se provi ad aggiungere il forking protocollo di prontezza ad esso, poiché attuare il protocollo correttamente significa biforcarsi dopo tutta l'inizializzazione è stata eseguita, incluso l'avvio di tutti i thread. Quasi niente in realtà usa il forking protocollo di prontezza in natura. Usa un altro protocollo.

Correlati:Linux – Quando non dovrei uccidere -9 un processo?

Ulteriori letture

  • 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). "Non biforcare() per 'mettere il daimon in background'.". Errori da evitare durante la progettazione di programmi demoniaci Unix . Risposte frequenti.
  • Jonathan de Boyne Pollard (2015). Non hai davvero bisogno di demonizzare. Davvero. . La casa dell'orrore sistemata.
  • Jonathan de Boyne Pollard (2015). Problemi di prontezza del protocollo con i demoni Unix . Risposte frequenti.

Linux
  1. Comprensione di systemd all'avvio su Linux

  2. Aggiorna il timeout del menu di GRUB2 su RHEL 7 Linux

  3. Aggiunta di un nuovo servizio a Linux systemd

  4. Linux – Posizione dello script Fsck?

  5. Come elencare i servizi Systemd in Linux

Comando di timeout in Linux

Tutto sui demoni in Linux

Come modificare il timeout della password di Sudo in Linux

Come eseguire lo script della shell come servizio SystemD in Linux

Tutorial sull'uso del comando Timeout su Linux

Obarun – Una distribuzione Linux basata su Arch senza Systemd