> 백엔드 개발 > Golang > Go에서 Ctrl C가 `exec.Command`를 중단하는 것을 어떻게 방지할 수 있나요?

Go에서 Ctrl C가 `exec.Command`를 중단하는 것을 어떻게 방지할 수 있나요?

DDD
풀어 주다: 2024-12-14 00:20:16
원래의
573명이 탐색했습니다.

How Can I Prevent Ctrl C from Interrupting `exec.Command` in Go?

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 = &amp;syscall.SysProcAttr{
    Setpgid: true,
}
로그인 후 복사

이 수정 사항을 통합하면 "sleep" 명령이 더 이상 다음에 의해 중단되지 않습니다. Ctrl C를 사용하면 독립적으로 계속 실행할 수 있습니다.

위 내용은 Go에서 Ctrl C가 `exec.Command`를 중단하는 것을 어떻게 방지할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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