Golang でのサブプロセスの終了
Golang では、os/exec パッケージを使用して外部コマンドをサブプロセスとして実行できます。ただし、実行中のサブプロセスを途中で終了する必要がある場合もあります。
cmd.Process.Kill() の使用
サブプロセスを強制終了する最も簡単な方法は次のとおりです。 cmd.Process オブジェクトの Kill() メソッドを使用します。この方法により、プロセスをすぐに終了できます。
cmd := exec.Command("sleep", "5") if err := cmd.Start(); err != nil { log.Fatal(err) } if err := cmd.Process.Kill(); err != nil { log.Fatal("failed to kill process: ", err) }
タイムアウトによるプロセスの強制終了
場合によっては、サブプロセスの実行時間を制限したい場合があります。 。これを実現するには、コンテキスト パッケージを使用できます。
ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second) defer cancel() if err := exec.CommandContext(ctx, "sleep", "5").Run(); err != nil { // This will fail after 3 seconds, interrupting the 5-second sleep. }
Go 1.7 より前のレガシー アプローチ
Go 1.7 より前には、コンテキスト パッケージがありませんでした。チャネルとゴルーチンを使用したより複雑なアプローチが必要でした。
cmd := exec.Command("sleep", "5") if err := cmd.Start(); err != nil { log.Fatal(err) } done := make(chan error, 1) go func() { done <- cmd.Wait() }() select { case <-time.After(3 * time.Second): if err := cmd.Process.Kill(); err != nil { log.Fatal("failed to kill process: ", err) } log.Println("process killed as timeout reached") case err := <-done: if err != nil { log.Fatalf("process finished with error = %v", err) } log.Print("process finished successfully") }
これらのアプローチに従うことで、次のことが可能になります。 Golang の os/exec で開始されたサブプロセスを、時間制約の有無にかかわらず効果的に終了します。
以上がタイムアウト処理を含め、Go でサブプロセスを効率的に終了するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。