首頁 >後端開發 >Golang >如何防止 Ctrl C 中斷 Go 中的 `exec.Command` 進程?

如何防止 Ctrl C 中斷 Go 中的 `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?

防止Ctrl C 中斷exec.Command 進程

儘管透過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 將產生指示「睡眠」指令被中斷的輸出,儘管主程式沒有退出。

解決方案:控制進程組

按下 Ctrl C 時 shell 向整個進程組發出訊號會導致中斷。為了將子進程與此訊號隔離,該命令必須在其自己的進程組中啟動。這可以透過在啟動程序之前設定SysProcAttr.Setpgid 和SysProcAttr.Pgid 欄位來實現:

cmd := exec.Command("sleep", "60")
cmd.SysProcAttr = &syscall.SysProcAttr{
    Setpgid: true,
}

執行下列步驟,主程式可以攔截Ctrl C 訊號,而不會中斷使用exec.Command 啟動的進程,確保流程穩定執行。

以上是如何防止 Ctrl C 中斷 Go 中的 `exec.Command` 進程?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn