GNU/Linux >> Znalost Linux >  >> Linux

Linux – časový limit Systemd, protože nedetekuje rozvětvení démonů?

Momentálně vyvíjím démona systemd. Problém, kterému čelím, je ten, že démon je zabit 1 m30 s po spuštění, protože nebylo detekováno rozvětvení.

Používám int daemon(int nochdir, int noclose) funkce k démonizaci procesu.

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

Zde je soubor služby /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

Funkce démona má proces rozvětvit a odpojit od terminálu, také zavřu deskriptory souborů a změním pracovní adresář na /.

Zdá se však, že systemd nedetekuje rozvětvení, protože zabíjí mého běžícího démona po 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'.

Má někdo tušení, proč systemd nezjistí rozvětvení?

Musím explicitně volat fork() v mém kódu?
V tomto případě budu muset nakódovat funkci daemonize sám, což není tak obtížné, ale zcela zbytečné a nadbytečné, protože funkce c pro tento účel již existuje.

Přijatá odpověď:

Nedělejte to.

Vůbec. Cokoli z toho, buď prostřednictvím funkce knihovny, nebo rolováním vlastního kódu. Pro jakýkoli systém řízení služeb. Od 90. let to byla mylná myšlenka.

Váš démon je již běžící v kontextu služby, vyvolaný tímto způsobem správcem služeb. Váš program by neměl nedělat nic v tomto ohledu. Přestaňte svůj program vůbec psát tímto způsobem.

A nepoužívejte forking protokol připravenosti. Váš program je vícevláknový a téměř jistě nebude fungovat správně, pokud se pokusíte přidat forking protokol připravenosti k němu, protože správné uzákonění protokolu znamená rozvětvení po byla provedena veškerá inicializace, včetně spuštění všech vláken. Téměř nic vlastně používá forking protokol připravenosti ve volné přírodě. Použijte jiný protokol.

Související:Linux – Kdy bych neměl zabít -9 proces?

Další čtení

  • 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). „Neforkujte(), abyste ‚dæmona neposunuli do pozadí‘.“ Chyby, kterých je třeba se vyvarovat při navrhování unixových démonických programů . Často uváděné odpovědi.
  • Jonathan de Boyne Pollard (2015). Opravdu nemusíte démonizovat. Opravdu. . Systemd House of Horror.
  • Jonathan de Boyne Pollard (2015). Problémy s protokolem připravenosti u unixových démonů . Často uváděné odpovědi.

Linux
  1. Pochopení systemd při startu na Linuxu

  2. Aktualizujte časový limit nabídky GRUB2 na RHEL 7 Linux

  3. Změnit časový limit úlohy Systemd Stop v konfiguraci Nixos?

  1. Linux – umístění skriptu Fsck?

  2. Jak vypsat Systemd Services v Linuxu

  3. Služba OS Linux „sshd“

  1. Nahrazení rc.local v systemd systémech Linux

  2. Rychlejší rozvětvení velkých procesů na Linuxu?

  3. Vytvoření démona v Linuxu