Golang에서 Ctrl C가 exec.Command를 방해하지 않도록 방지
exec.Command를 사용하여 명령을 실행할 때 잠재력을 인식하는 것이 중요합니다. Ctrl C 중단의 경우, 그러한 신호를 가로채기 위해 signal.Notify가 사용된 경우에도 마찬가지입니다. 이 문제는 다음 예에서 관찰할 수 있습니다.
package main import ( "log" "os" "os/exec" "os/signal" "syscall" ) func sleep() { log.Println("Sleep start") cmd := exec.Command("sleep", "60") cmd.Run() log.Println("Sleep stop") } func main() { var doneChannel = make(chan bool) go sleep() 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" 명령이 중단된다는 출력이 표시됩니다.
2015/10/16 10:05:50 Sleep start ^C2015/10/16 10:05:52 Receved Ctrl + C 2015/10/16 10:05:52 Sleep stop
이 문제를 해결하는 열쇠는 Ctrl C를 누를 때 쉘이 전체 프로세스 그룹에 신호를 보낸다는 것을 인식하는 것입니다. syscall.SysProcAttr의 Setpgid 및 Pgid 필드를 사용하여 자체 프로세스 그룹에서 명령을 시작하면 이 동작을 방지할 수 있습니다.
cmd := exec.Command("sleep", "60") cmd.SysProcAttr = &syscall.SysProcAttr{ Setpgid: true, }
이 수정 사항을 통합하면 "sleep" 명령이 더 이상 다음에 의해 중단되지 않습니다. Ctrl C를 사용하면 독립적으로 계속 실행할 수 있습니다.
위 내용은 Go에서 Ctrl C가 `exec.Command`를 중단하는 것을 어떻게 방지할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!