Go で長時間実行プロセスを実行し、親プロセスから切り離す方法は?
Go でコマンドを実行し、プロセスから切り離す
問題
Go で長時間実行プロセスを実行する必要があります。次の要件:
- プロセスの標準出力をファイルにリダイレクトします。
- プロセスのユーザーを制御します。
- プログラムが終了した後もプロセスが継続するようにします。
- プロセスがクラッシュしたときにゾンビになるのを防ぎます。
- 実行中のプロセスの PID を取得します。
ルート権限でプログラムを実行しています。 exec.Command() と syscall.SysProcAttr を使用して解決策を試みましたが、SIGTERM/SIGKILL をプログラムに送信すると失敗し、基礎となるプロセスがクラッシュします。プログラムの制御とは別に、プロセスをデーモンとして実行したいと考えています。
解決策
github.com/bashicorp/go-reap などの外部ライブラリを使用することを強くお勧めします。問題を効果的に解決します。ただし、カスタム実装を希望する場合は、次のアプローチを検討できます。
- 標準出力をリダイレクト: cmd.Stdout = stdLogFile を使用して、プロセスの標準出力を指定されたファイルにリダイレクトします。 .
- ユーザーの制御: プロセスのユーザーを制御するには、cmd.SysProcAttr = &syscall.SysProcAttr{Credential: &syscall.Credential{Uid: uid}} を設定します。
- プロセスから切り離す: go func() { cmd.Wait() }() を使用して別の goroutine でコマンドを実行し、ゾンビになるのを防ぎます。
- PID の取得: cmd.Process.Pid を使用して、実行中のプロセスの PID を取得します。
注
プロセスの継承に関する親プロセスと子プロセス。すべてのプロセスには親が必要で、親が死亡すると、子は孤立して PID 1 (init) に採用されます。言い換えれば、子は、それを開始した最初のプロセスとは異なる親を持つことはできません。
親が終了した後もプロセスが実行し続けるようにするには、systemd や docker などの専用のプロセス マネージャーを使用することを検討してください。孤立したプロセスを削除し、継続的な実行を保証します。その他の考えられる解決策には、カスタム デーモンを作成するか、go-daemon のようなライブラリを使用して、親プログラムから独立してプロセスのライフサイクルを管理することが含まれます。
以上がGo で長時間実行プロセスを実行し、親プロセスから切り離す方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











Go Language Packのインポート:アンダースコアとアンダースコアなしの違いは何ですか?

MySQLクエリ結果リストをGO言語のカスタム構造スライスに変換する方法は?

GOのジェネリックのカスタムタイプ制約を定義するにはどうすればよいですか?

GOでテスト用のモックオブジェクトとスタブを書くにはどうすればよいですか?

トレースツールを使用して、GOアプリケーションの実行フローを理解するにはどうすればよいですか?
