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

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

DDD
發布: 2024-12-14 00:20:16
原創
573 人瀏覽過

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

防止Ctrl C 中斷Golang 中的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,輸出表示「睡眠」指令中斷,即使主程式繼續運作:

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 時shell 會向整個進程組發出信號。可以透過使用syscall.SysProcAttr 中的Setpgid 和Pgid 欄位在其自己的進程組中啟動命令來防止此行為:

cmd := exec.Command("sleep", "60")
cmd.SysProcAttr = &amp;syscall.SysProcAttr{
    Setpgid: true,
}
登入後複製

透過合併此修改,「睡眠」命令將不再中斷Ctrl C,讓它繼續獨立運作。

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

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