> 백엔드 개발 > Golang > 시간 초과가 발생할 때 Go에서 하위 프로세스를 안정적으로 종료하는 방법은 무엇입니까?

시간 초과가 발생할 때 Go에서 하위 프로세스를 안정적으로 종료하는 방법은 무엇입니까?

Susan Sarandon
풀어 주다: 2024-11-27 09:19:11
원래의
1067명이 탐색했습니다.

How to Reliably Kill Child Processes in Go When a Timeout Occurs?

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿