Go에서 하위 프로세스 종료: 시간 초과 문제 해결
제공된 Go 코드 스니펫에서 2초의 시간 초과를 설정하고 시도하더라도 신호로 하위 프로세스를 종료하면 프로세스는 지속되고 "대기 완료"는 인쇄되지 않은 상태로 유지됩니다. 이 동작은 프로세스가 할당된 시간 이후에도 활성 상태로 유지됨을 의미합니다.
이 문제의 근본 원인은 cmd.Process.Signal()을 사용하여 하위 프로세스를 종료하는 데 있습니다. 이 함수는 하위 프로세스가 아닌 메인 프로세스에만 신호를 보낸다는 점을 기억하는 것이 중요합니다. 하위 프로세스를 효과적으로 종료하려면 하위 프로세스가 포함된 프로세스 그룹을 대상으로 지정해야 하며, 이는 다음 접근 방식을 사용하여 수행할 수 있습니다.
// First, create the command and set up its attributes cmd := exec.Command( some_command ) cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true} // Then, start the command cmd.Start() // Next, obtain the process group ID of the child process pgid, err := syscall.Getpgid(cmd.Process.Pid) if err == nil { // If the process group ID is successfully obtained, terminate it syscall.Kill(-pgid, 15) // note the minus sign } // Finally, wait for the command to complete cmd.Wait()
syscall.SysProcAttr에서 Setpgid를 true로 설정하여 다음과 같이 지시합니다. OS는 하위 프로세스에 대한 새 프로세스 그룹을 생성하여 상위 프로세스로 전송된 신호가 하위 프로세스에 영향을 미치지 않도록 합니다. 빼기 로그인 -pgid를 사용하면 하위 프로세스를 포함하여 프로세스 그룹의 모든 구성원에게 신호가 전송됩니다.
이 솔루션은 플랫폼별로 다르며 모든 운영 체제에서 작동하지 않을 수 있습니다. 그러나 OSX Yosemite 및 다양한 Linux 배포판에서 작동하는 것으로 보고되었으며 Windows 및 BSD에서의 호환성은 여전히 불확실합니다.
위 내용은 시간 초과가 발생할 때 Go에서 하위 프로세스를 안정적으로 종료하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!