Rumah > pembangunan bahagian belakang > Golang > Bagaimanakah saya boleh menghalang systemd daripada membunuh proses anak apabila proses induk ditamatkan?

Bagaimanakah saya boleh menghalang systemd daripada membunuh proses anak apabila proses induk ditamatkan?

Barbara Streisand
Lepaskan: 2024-12-21 04:57:09
asal
705 orang telah melayarinya

How can I prevent systemd from killing child processes when the parent process terminates?

Mengendalikan Proses Kanak-Kanak dalam Systemd: Menyelesaikan Isu Pengasingan Proses

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())
    }
}
Salin selepas log masuk

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
Salin selepas log masuk

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
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan