ホームページ >バックエンド開発 >Golang >Go で Ctrl C が exec.Command を中断しないようにするにはどうすればよいですか?

Go で Ctrl C が exec.Command を中断しないようにするにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-27 20:46:13778ブラウズ

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

Golang で Ctrl C による exec.Command の中断を防ぐ

exec.Command を使用して外部プロセスを実行するときに、プロセスは、割り込みをインターセプトした場合でも、Ctrl C で中断されます。 signal.

この動作は、Ctrl C キーが押されたときにシェルがプロセス グループ全体に信号を送るために発生します。親プロセスはシグナルを受信し、すべての子プロセスに転送するため、子プロセスが中断されます。

これを防ぐには、syscall.SysProcAttr を使用して独自のプロセス グループでコマンドを開始します。 Setpgid フィールドを true に設定すると、コマンドの新しいプロセス グループが作成され、親プロセスから分離されます。

syscall.SysProcAttr を使用して例を変更する方法は次のとおりです。

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("Receved Ctrl + C")
    }()

    <-doneChannel
}

実行中に Ctrl C を押すと、メイン プログラムのみがシグナルを受信します。 sleep コマンドは、完了時間の 60 秒まで実行され続けます。これにより、プロセスが予期せず中断されることがなくなります。

以上がGo で Ctrl C が exec.Command を中断しないようにするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。