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

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

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

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 欄位來實現。

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

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,輸出如下產生:

1

2

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
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板