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

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

Patricia Arquette
Patricia Arquette원래의
2024-12-12 19:46:15230검색

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

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

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.