Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Melepaskan Proses Lama dalam Go dan Mengelakkan Zombi?

Bagaimana untuk Melepaskan Proses Lama dalam Go dan Mengelakkan Zombi?

Linda Hamilton
Linda Hamiltonasal
2024-11-01 07:51:31253semak imbas

How to Detach a Long-Running Process in Go and Avoid Zombies?

Jalankan Perintah dalam Go dan Tanggalkannya daripada Proses

Masalah:

Anda perlu laksanakan proses yang berjalan lama dalam Go dan pastikan bahawa:

  • stdout dihalakan semula ke fail.
  • Pengguna proses dikawal.
  • Proses tidak mati apabila program anda keluar.
  • Proses tidak menjadi zombie jika ia ranap.
  • Anda mendapat PID proses berjalan.

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!

Kenyataan:
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