Go에서 명령을 실행하고 프로세스에서 분리
문제:
다음을 수행해야 합니다. Go에서 장기 실행 프로세스를 실행하고 즉:
시도한 해결 방법:
cmd.Start() 및 cmd.Process.Release()를 사용해 보았으나 이를 방지하지 못했습니다. 프로그램이 종료될 때 좀비가 되는 것을 방지합니다. 또한 프로세스가 자체 상위 PID, 그룹 PID 등을 사용하여 최대한 분리되기를 원합니다.
해결책:
현재 직면한 문제는 다음과 같습니다. Linux에서는 일단 시작된 프로세스의 상위 프로세스를 변경하는 것을 허용하지 않습니다. 진정한 분리된 프로세스를 원한다면 atd나 systemd와 같은 다른 것에 의해 시작되어야 합니다.
좀비 및 프로세스 종료 문제를 해결하려면 [go-reap]과 같은 라이브러리를 사용할 수 있습니다. (https://github.com/hashicorp/go-reap). 고아 프로세스를 자동으로 회수하고 종료 상태를 보고하는 Reaper 서비스를 제공합니다.
다음은 go-reap을 사용하여 분리된 프로세스를 시작하는 예입니다.
<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>
go-reap 사용 종료 시 프로세스를 회수하면 좀비가 되지 않는지 확인하고 종료 상태를 추적할 수 있습니다.
위 내용은 Go에서 장기 실행 프로세스를 분리하고 좀비를 피하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!