Rumah > Artikel > pembangunan bahagian belakang > Bagaimana untuk Melepaskan Proses Lama dalam Go dan Mengelakkan Zombi?
Jalankan Perintah dalam Go dan Tanggalkannya daripada Proses
Masalah:
Anda perlu laksanakan proses yang berjalan lama dalam Go dan pastikan bahawa:
Percubaan Penyelesaian:
Anda cuba menggunakan cmd.Start() dan cmd.Process.Release(), tetapi ia tidak menghalang proses daripada menjadi zombi apabila program anda keluar. Anda juga mahu proses itu berasingan mungkin, dengan PID induknya sendiri, PID kumpulan, dll.
Penyelesaian:
Masalah yang anda hadapi ialah bahawa Linux tidak membenarkan anda menukar induk proses sebaik sahaja ia dimulakan. Jika anda mahukan proses yang benar-benar terpisah, ia perlu dimulakan dengan sesuatu yang lain, seperti atd atau systemd.
Untuk menangani isu zombi dan penamatan proses, anda boleh menggunakan perpustakaan seperti [go-reap] (https://github.com/hashicorp/go-reap). Ia menyediakan perkhidmatan Reaper yang secara automatik menuai proses anak yatim dan melaporkan status keluar mereka.
Berikut ialah contoh menggunakan go-reap untuk memulakan proses terpisah:
<code class="go">package main import ( "context" "fmt" "os/exec" "github.com/hashicorp/go-reap" ) func main() { // Start a Reaper service to reap orphaned processes. doneCh := make(chan struct{}) ctx, cancel := context.WithCancel(context.Background()) reaper := reap.NewReaper(cancel) go reaper.Run(ctx) defer reaper.Stop() // Execute a command in a detached process. cmd := exec.Command("my-long-running-command", "args") pid, err := reaper.Reap(cmd) if err != nil { fmt.Printf("Error reaping process: %v\n", err) return } fmt.Printf("PID of detached process: %v\n", pid) // Wait for the detached process to complete. exitStatus, err := reaper.WaitPid(pid) if err != nil { fmt.Printf("Error waiting for process: %v\n", err) return } fmt.Printf("Detached process exited with status: %v\n", exitStatus) // Stop the Reaper service when done. close(doneCh) }</code>
Dengan menggunakan go-reap dan menuai proses apabila ia keluar, anda boleh memastikan ia tidak menjadi zombi dan anda boleh menjejaki status keluarnya.
Atas ialah kandungan terperinci Bagaimana untuk Melepaskan Proses Lama dalam Go dan Mengelakkan Zombi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!