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

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

DDD
發布: 2024-12-11 02:26:11
原創
264 人瀏覽過

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

防止Ctrl C 中斷Golang 中的exec.Command

使用exec.Command 啟動進程時可能會遇到Ctrl C 的中斷,即使透過signal.Notify 攔截中斷呼叫。出現此問題的原因是 shell 在收到 Ctrl C 後向整個進程組發送訊號。因此,使用 exec.Command 啟動的子進程也會受到影響。

緩解此問題並防止 Ctrl C 中斷對於子進程,在開始執行之前需要先與自己的進程組建立命令。這可以透過使用 syscall.SysProcAttr 結構的 SysProcAttr、Setpgid 和 Pgid 欄位來實現。

這是一個結合了此方法的修改範例:

package main

import (
    "log"
    "os"
    "os/exec"
    "os/signal"
    "syscall"
)

func sleep() {
    log.Println("Sleep start")
    cmd := exec.Command("sleep", "60")
    cmd.SysProcAttr = &syscall.SysProcAttr{
        Setpgid: true,
    }
    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("Received Ctrl + C")
    }()

    <-doneChannel
}
登入後複製

透過此修改,當程式執行時按Ctrl C,輸出如下產生:

2015/10/16 10:05:50 Sleep start
^C2015/10/16 10:05:52 Received Ctrl + C
登入後複製

sleep指令繼續成功運行,示範了透過Ctrl C防止中斷。

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

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