Apabila melahirkan proses anak yang berjalan lama, adalah penting untuk memastikan kemandirian mereka melebihi jangka hayat proses utama, terutamanya apabila diuruskan oleh systemd. Dalam sesetengah senario, proses kanak-kanak mungkin ditamatkan secara tidak dijangka, menyebabkan tugas latar belakang kritikal tidak dapat dikendalikan.
Pertimbangkan isu berikut yang dihadapi semasa cuba mencipta proses utama yang memulakan proses kanak-kanak menggunakan bahasa pengaturcaraan go:
package main import ( "log" "os" "os/exec" "syscall" "time" ) func main() { if len(os.Args) == 2 && os.Args[1] == "child" { for { time.Sleep(time.Second) } } else { cmd := exec.Command(os.Args[0], "child") cmd.SysProcAttr = &syscall.SysProcAttr{Setsid: true} log.Printf("child exited: %v", cmd.Run()) } }
Apabila melaksanakan program ini dari terminal, proses anak berterusan walaupun selepas proses utama dihentikan atau ditamatkan (Ctrl Z dan bunuh -INT 7914). Walau bagaimanapun, apabila proses utama dimulakan sebagai perkhidmatan systemd, proses anak juga ditamatkan secara tiba-tiba.
Untuk menyelesaikan isu ini, ubah suai fail perkhidmatan systemd (/etc/systemd/system/exectest.service) dengan menambah baris berikut:
KillMode=process
Tetapan ini mengarahkan systemd untuk mematikan proses utama sahaja, membolehkan proses anak terus berjalan. Secara lalai, systemd menggunakan mod kumpulan kawalan, yang mematikan semua proses dalam kumpulan kawalan yang sama seperti proses utama.
Fail perkhidmatan systemd yang dikemas kini:
[Unit] Description=ExecTest [Service] Type=simple ExecStart=/home/snowm/src/exectest/exectest User=snowm KillMode=process [Install] WantedBy=multi-user.target
Dengan pengubahsuaian ini, proses kanak-kanak akan bertahan selepas penamatan proses utama, memastikan kestabilan dan kesinambungan tugas latar belakang.
Atas ialah kandungan terperinci Bagaimanakah saya boleh menghalang systemd daripada membunuh proses anak apabila proses induk ditamatkan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!