exec.Command 프로세스의 Ctrl C 중단 방지
signal.Notify를 통해 인터럽트 호출을 가로채더라도 exec.Command로 시작된 프로세스는 여전히 취약합니다. Ctrl C에 의해 중단됩니다. 다음을 고려하십시오. 데모:
package main import ( "log" "os" "os/exec" "os/signal" "syscall" ) func main() { var doneChannel = make(chan bool) go func() { log.Println("Sleep start") cmd := exec.Command("sleep", "60") cmd.Run() log.Println("Sleep stop") }() c := make(chan os.Signal, 1) signal.Notify(c, os.Interrupt) signal.Notify(c, syscall.SIGTERM) go func() { <-c log.Println("Receved Ctrl + C") }() <-doneChannel }
프로그램 실행 중에 Ctrl C를 누르면 기본 프로그램이 종료되지 않았음에도 불구하고 "sleep" 명령이 중단되었음을 나타내는 출력이 생성됩니다.
해결책: 프로세스 그룹
Ctrl C를 누르면 전체 프로세스 그룹에 신호를 보내는 쉘에서 중단이 발생합니다. 이 신호에서 하위 프로세스를 분리하려면 명령이 자체 프로세스 그룹에서 시작되어야 합니다. 이는 프로세스를 시작하기 전에 SysProcAttr.Setpgid 및 SysProcAttr.Pgid 필드를 설정하여 달성할 수 있습니다.
cmd := exec.Command("sleep", "60") cmd.SysProcAttr = &syscall.SysProcAttr{ Setpgid: true, }
이 단계를 따르면 기본 프로그램은 exec.Command로 시작된 프로세스를 중단하지 않고 Ctrl C 신호를 가로챌 수 있습니다. , 안정적인 프로세스 실행을 보장합니다.
위 내용은 Go에서 Ctrl C가 `exec.Command` 프로세스를 중단하는 것을 어떻게 방지할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!