Bagaimana untuk Menjalankan Proses Jangka Panjang dalam Go dan Menyingkirkannya daripada Proses Induk?

Linda Hamilton
Lepaskan: 2024-10-29 18:31:43
asal
225 orang telah melayarinya

How to Run a Long-Running Process in Go and Detach It from the Parent Process?

Menjalankan Perintah dalam Go dan Mengeluarkannya daripada Proses

Masalah

Saya perlu melaksanakan proses yang berjalan lama dalam Go, memenuhi keperluan berikut:

  1. Ubah hala stdout proses ke fail.
  2. Kawal pengguna proses.
  3. Pastikan proses diteruskan selepas program saya keluar.
  4. Halang proses daripada menjadi zombi apabila ia ranap.
  5. Dapatkan PID proses berjalan.

Saya sedang menjalankan program saya dengan kebenaran root dan mempunyai mencuba penyelesaian menggunakan exec.Command() dan syscall.SysProcAttr, tetapi ia gagal apabila saya menghantar SIGTERM/SIGKILL ke program saya, menyebabkan proses asas ranap. Saya mahu menjalankan proses sebagai daemon, berasingan daripada kawalan program saya.

Penyelesaian

Menggunakan perpustakaan luaran, seperti github.com/hashicorp/go-reap, adalah sangat disyorkan sebagai ia berkesan menyelesaikan isu tersebut. Walau bagaimanapun, jika anda lebih suka pelaksanaan tersuai, pendekatan berikut boleh dipertimbangkan:

  1. Ubah hala Output Standard: Gunakan cmd.Stdout = stdLogFile untuk mengubah hala stdout proses ke fail yang ditentukan .
  2. Kawal Pengguna: Tetapkan cmd.SysProcAttr = &syscall.SysProcAttr{Kredential: &syscall.Credential{Uid: uid}} untuk mengawal pengguna proses.
  3. Alih keluar daripada Proses: Jalankan arahan dalam goroutine berasingan menggunakan go func() { cmd.Wait() }() untuk mengelakkannya daripada menjadi zombi.
  4. Dapatkan PID: Gunakan cmd.Process.Pid untuk mendapatkan PID proses yang sedang berjalan.

Nota

Adalah penting untuk mengakui bahawa mustahil untuk memisahkan sepenuhnya proses ibu bapa dan anak dari segi proses pewarisan. Semua proses mesti mempunyai ibu bapa, dan jika ibu bapa meninggal dunia, anak itu akan menjadi yatim piatu dan diterima pakai oleh PID 1 (init). Dalam erti kata lain, kanak-kanak tidak boleh mempunyai ibu bapa yang berbeza daripada proses awal yang memulakannya.

Untuk memastikan proses terus berjalan selepas ibu bapa keluar, pertimbangkan untuk menggunakan pengurus proses khusus seperti systemd atau docker, yang boleh mengurus proses yatim dan memastikan pelaksanaannya berterusan. Penyelesaian berpotensi lain termasuk menulis daemon tersuai atau menggunakan perpustakaan seperti go-daemon untuk mengurus kitaran hayat proses secara bebas daripada program induk.

Atas ialah kandungan terperinci Bagaimana untuk Menjalankan Proses Jangka Panjang dalam Go dan Menyingkirkannya daripada Proses Induk?. 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