GNU/Linux >> Belajar Linux >  >> Linux

Linux – Systemd Timeout Karena Tidak Mendeteksi Daemon Forking?

Saat ini saya sedang mengembangkan daemon systemd. Masalah yang saya hadapi adalah daemon mati 1m30 detik setelah diluncurkan karena forking tidak terdeteksi.

Saya menggunakan int daemon(int nochdir, int noclose) berfungsi untuk melakukan daemonisasi proses.

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

Berikut adalah file layanan /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

Fungsi daemon seharusnya memotong proses dan melepaskannya dari terminal, saya juga menutup deskriptor file dan mengubah direktori kerja ke /.

Namun systemd tampaknya tidak mendeteksi forking karena mematikan daemon saya yang sedang berjalan setelah 1m30 detik.

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

Adakah yang tahu mengapa systemd tidak mendeteksi forking?

Apakah saya harus secara eksplisit memanggil fork() dalam kode saya?
Dalam hal ini saya harus mengkodekan fungsi daemonize sendiri yang tidak terlalu sulit tetapi sama sekali tidak berguna dan berlebihan karena fungsi c sudah ada untuk tujuan itu.

Jawaban yang Diterima:

Jangan lakukan itu.

Sama sekali. Semua itu, baik melalui fungsi perpustakaan atau menggulirkan kode Anda sendiri. Untuk sistem manajemen layanan apa pun. Ini adalah ide yang salah arah sejak tahun 1990-an.

Iblismu sudah berjalan dalam konteks layanan, dipanggil seperti itu oleh manajer layanan. Program Anda seharusnya tidak melakukan apa-apa dalam hal ini. Berhentilah menulis program Anda seperti itu sama sekali.

Dan jangan gunakan forking protokol kesiapan. Program Anda multithreaded dan hampir pasti tidak akan berfungsi dengan benar jika Anda mencoba menambahkan forking protokol kesiapan untuk itu, karena memberlakukan protokol dengan benar berarti melakukan forking setelah semua inisialisasi telah dilakukan, termasuk memulai semua utas. Hampir tidak ada sebenarnya menggunakan forking protokol kesiapan di alam liar. Gunakan protokol lain.

Terkait:Linux – Kapan saya tidak boleh mematikan -9 suatu proses?

Bacaan lebih lanjut

  • 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). "Jangan bercabang () untuk 'menempatkan iblis ke latar belakang'.“. Kesalahan yang harus dihindari saat merancang program iblis Unix . Jawaban yang Sering Diberikan.
  • Jonathan de Boyne Pollard (2015). Anda benar-benar tidak perlu melakukan daemonisasi. Sungguh. . Sistem House of Horror.
  • Jonathan de Boyne Pollard (2015). Masalah protokol kesiapan dengan Unix dmons . Jawaban yang Sering Diberikan.

Linux
  1. Perbarui batas waktu menu GRUB2 di RHEL 7 Linux

  2. Mengganti rc.local di systemd sistem Linux

  3. Cara membuat layanan Systemd di Linux

  1. Cara Mendaftar Layanan Systemd di Linux

  2. Mendeteksi Windows atau Linux di C, C++

  3. Membuat daemon di Linux

  1. Memahami systemd saat startup di Linux

  2. Menambahkan layanan baru ke sistem Linuxd

  3. Ubah Systemd Stop Job Timeout Dalam Konfigurasi Nixos?