GNU/Linux >> Belajar Linux >  >> Linux

Systemd Dan Proses Pemijahan:Proses Anak Dibunuh Saat Proses Utama Keluar?

Biasanya tidak memposting di sini, tetapi saya mengacaukan yang ini.
Saya memiliki skrip Python yang bercabang saat diluncurkan, dan bertanggung jawab untuk memulai banyak proses lainnya. Skrip ini dulu diluncurkan saat startup melalui sysvinit , tetapi baru-baru ini saya memutakhirkan ke Debian Jessie jadi telah mengadaptasinya untuk diluncurkan melalui systemd .

Sayangnya, saya mengalami masalah yang tidak dapat saya selesaikan. Saat Anda meluncurkan skrip secara langsung di shell pengguna, skrip akan meluncurkan proses turunannya dengan benar, dan saat skrip keluar, proses turunan menjadi yatim piatu dan terus berjalan.

Saat diluncurkan Via systemd, jika proses induk keluar, semua anak juga keluar (Nah, screen s bahwa mereka meluncurkan mati dan muncul sebagai Mati).

Idealnya saya harus dapat memulai ulang skrip induk tanpa mematikan semua proses anak, apakah ada sesuatu yang saya lewatkan?

Terima kasih!

[Unit]
Description=Server commander
After=network.target

[Service]
User=serveruser
Type=forking
PIDFile=/var/Server/Server.pid

ExecStart=/var/Server/Server.py
ExecStop=/bin/kill -s TERM $MAINPID

[Install]
WantedBy=multi-user.target

Sunting:

Mungkin relevan bagi saya untuk menunjukkan bahwa skrip Python pada dasarnya adalah 'pengontrol' untuk proses turunannya. Ini memulai dan menghentikan server di screen GNU s seperti yang diminta dari server pusat. Biasanya selalu berjalan, tidak memunculkan layanan dan keluar.

Namun ada beberapa kasus di mana saya ingin dapat memuat ulang skrip tanpa mematikan proses anak, bahkan jika itu berarti prosesnya menjadi yatim piatu ke pid 1. Bahkan, tidak masalah jika skrip Python memulai proses sebagai proses induk, jika memungkinkan.

Penjelasan yang lebih baik tentang cara kerjanya:

  • systemd memunculkan Server.py
  • Server.py garpu dan menulis file pid untuk systemd
  • Server.py kemudian memunculkan proses server di layar gnu berdasarkan instruksinya
  • Server.py terus berjalan untuk melakukan restart yang diminta dari server

Saat meluncurkan tanpa systemd , Server.py dapat dimulai ulang dan screen GNU diluncurkan tidak terpengaruh. Saat meluncurkan dengan systemd , ketika Server.py dimatikan, alih-alih proses layar tersebut menjadi yatim piatu ke pid 1, mereka terbunuh.

Jawaban yang Diterima:

Saya berhasil memperbaikinya hanya dengan mengatur KillMode untuk process bukannya control-group (bawaan). Terima kasih semuanya!

Terkait:Linux – bagaimana cara unshare jaringan untuk proses saat ini?
Linux
  1. Apa Proses Zombie Dan Bagaimana Menemukan &Membunuh Proses Zombie?

  2. Kapan Dd Cocok Untuk Menyalin Data? (atau, Kapan Read() Dan Write() Partial)?

  3. Mengapa Proses Pgid Anak Bukan Pid Orang Tua?

  1. Proses Masuk dan Jumlah Proses yang Dijelaskan

  2. Proses UNIX / Linux:C fork() Fungsi

  3. Bagaimana cara membuat proses anak mati setelah orang tua keluar?

  1. Tidak dapat melepaskan proses anak saat proses utama dimulai dari systemd

  2. Bagaimana cara menjalankan skrip ketika surat tiba di server surat? (Debian)

  3. Bagaimana systemd menangani kematian anak dari proses yang dikelola?