ホームページ  >  記事  >  バックエンド開発  >  Go で長時間実行プロセスを実行し、親プロセスから切り離す方法は?

Go で長時間実行プロセスを実行し、親プロセスから切り離す方法は?

Linda Hamilton
Linda Hamiltonオリジナル
2024-10-29 18:31:43231ブラウズ

How to Run a Long-Running Process in Go and Detach It from the Parent Process?

Go でコマンドを実行し、プロセスから切り離す

問題

Go で長時間実行プロセスを実行する必要があります。次の要件:

  1. プロセスの標準出力をファイルにリダイレクトします。
  2. プロセスのユーザーを制御します。
  3. プログラムが終了した後もプロセスが継続するようにします。
  4. プロセスがクラッシュしたときにゾンビになるのを防ぎます。
  5. 実行中のプロセスの PID を取得します。

ルート権限でプログラムを実行しています。 exec.Command() と syscall.SysProcAttr を使用して解決策を試みましたが、SIGTERM/SIGKILL をプログラムに送信すると失敗し、基礎となるプロセスがクラッシュします。プログラムの制御とは別に、プロセスをデーモンとして実行したいと考えています。

解決策

github.com/bashicorp/go-reap などの外部ライブラリを使用することを強くお勧めします。問題を効果的に解決します。ただし、カスタム実装を希望する場合は、次のアプローチを検討できます。

  1. 標準出力をリダイレクト: cmd.Stdout = stdLogFile を使用して、プロセスの標準出力を指定されたファイルにリダイレクトします。 .
  2. ユーザーの制御: プロセスのユーザーを制御するには、cmd.SysProcAttr = &syscall.SysProcAttr{Credential: &syscall.Credential{Uid: uid}} を設定します。
  3. プロセスから切り離す: go func() { cmd.Wait() }() を使用して別の goroutine でコマンドを実行し、ゾンビになるのを防ぎます。
  4. PID の取得: cmd.Process.Pid を使用して、実行中のプロセスの PID を取得します。

プロセスの継承に関する親プロセスと子プロセス。すべてのプロセスには親が必要で、親が死亡すると、子は孤立して PID 1 (init) に採用されます。言い換えれば、子は、それを開始した最初のプロセスとは異なる親を持つことはできません。

親が終了した後もプロセスが実行し続けるようにするには、systemd や docker などの専用のプロセス マネージャーを使用することを検討してください。孤立したプロセスを削除し、継続的な実行を保証します。その他の考えられる解決策には、カスタム デーモンを作成するか、go-daemon のようなライブラリを使用して、親プログラムから独立してプロセスのライフサイクルを管理することが含まれます。

以上がGo で長時間実行プロセスを実行し、親プロセスから切り離す方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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