GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana systemd menangani kematian anak dari proses yang dikelola?

Tidak.

Proses utama menangani kematian anak-anaknya, dengan cara biasa.

Ini adalah dunia POSIX. Jika proses A bercabang B, dan proses B bercabang C, D, dan E; maka proses B adalah yang melihat SIGCHLD dan wait() status dari penghentian C, D, dan E. Proses A tidak mengetahui apa yang terjadi pada C, D, dan E, dan ini terlepas dari systemd.

Agar A mengetahui penghentian C, D, dan E, dua hal harus terjadi.

  • A harus mendaftarkan diri sebagai "subreaper". systemd melakukan ini, seperti halnya berbagai manajer layanan lainnya termasuk pemula dan nosh service-manager .
  • B harus exit() . Layanan yang secara bodoh, keliru, dan sia-sia mencoba untuk "menjelek-jelekkan" diri mereka sendiri yang melakukannya.

(Seseorang bisa menjadi pintar dengan kevent() di BSD. Tapi ini pertanyaan Linux.)


systemd memiliki konsep proses utama. Dalam dokumentasi systemd ini disebut sebagai "proses layanan utama" atau hanya "proses utama".

Contoh 4 dalam dokumentasi systemd.service menjelaskan apakah proses utama dihitung saat Type=forking .

Dokumentasi untuk Restart= dalam dokumen systemd.service menjelaskan berbagai kemungkinan ketika layanan dimulai sehubungan dengan proses utama.

Inilah teks kunci dari "contoh 4" yang ditautkan di atas:

systemd akan menganggap layanan sedang dalam proses inisialisasi sementara program aslinya masih berjalan. Setelah berhasil keluar dan setidaknya masih ada proses (andRemainAfterExit=no), layanan dianggap dimulai.

Seringkali, daemon tradisional hanya terdiri dari satu proses. Oleh karena itu, jika hanya satu proses yang tersisa setelah proses asli berakhir, systemd akan menganggap proses itu sebagai proses utama dari layanan. Dalam hal ini, variabel $MAINPID akan tersedia di ExecReload=,ExecStop=, dll.

Jika ada lebih dari satu proses yang tersisa, systemd tidak akan dapat menentukan proses utama, sehingga tidak akan dianggap ada. Dalam hal ini, $MAINPID tidak akan diperluas ke apa pun. Namun, jika proses memutuskan untuk menulis file PID biasa, systemd akan dapat membaca PID utama dari sana. Silakan atur PIDFile=sesuai.


Linux
  1. Bagaimana menemukan semua proses anak?

  2. Bagaimana cara mendapatkan ID proses untuk mematikan proses nohup?

  3. Bagaimana cara kerja antarmuka loopback

  1. Linux – Bagaimana Pembunuh Oom Memutuskan Proses Mana Yang Harus Dibunuh Pertama?

  2. Linux – Bagaimana Node.js / Modul Cluster Melewati Koneksi Baru Dari Proses Master / Induk, Ke Proses Anak?

  3. Bagaimana Proses Upgrade Ubuntu Bekerja?

  1. Bagaimana cara mengatur direktori kerja dari proses induk?

  2. Bagaimana cara kerja copy_from_user dari kernel Linux secara internal?

  3. Cara mendapatkan proses anak dari proses induk