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

如何防止 Ctrl C 中斷 Go 中的 `exec.Command` 進程?

Patricia Arquette
發布: 2024-12-12 19:46:15
原創
226 人瀏覽過

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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板