ホームページ  >  記事  >  バックエンド開発  >  Golang で長時間実行プロセスを実行し、ゾンビになるのを防ぐには?

Golang で長時間実行プロセスを実行し、ゾンビになるのを防ぐには?

Patricia Arquette
Patricia Arquetteオリジナル
2024-10-27 21:16:01386ブラウズ

How to Execute Long-Running Processes in Golang and Prevent Them From Becoming Zombies?

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

この問題は、Golang で長時間実行されるプロセスを実行する必要がある場合に発生します。以下のような特定の要件:

  • プロセスの stdout をファイルにリダイレクトする
  • プロセスのユーザーを制御する
  • 親プログラムが終了した後でもプロセスが実行し続けることを保証する
  • クラッシュ時にプロセスがゾンビになるのを防ぐ
  • 実行中のプロセスの PID を取得する

Cmd.Start() と Cmd.Wait() を使用して試みた解決策SIGTERM/SIGKILL をプログラムに送信するときに基になるプロセスがクラッシュするのを防ぐことを除いて、これらの要件のほとんどを満たします。

解決策

車輪の再発明を試みるのではなく、次のライブラリのいずれかの利用を検討してください:

  • https://github.com/krallin/tini
  • https://busybox.net/
  • https: //software.clapper.org/daemonize/
  • https://wiki.gentoo.org/wiki/OpenRC
  • https://www.freedesktop.org/wiki/Software/systemd /

Go-reap ライブラリ

推奨される解決策は、https://github.com/bashicorp/go-reap ライブラリを使用することです。

メモ

  • プロセスを親から切り離すという仮定は間違っています。 Linux では、すべてのプロセスに親プロセスがあり、作成後に変更することはできません。
  • 「デーモンとして実行したい」という文は不明瞭です。 Linux のデーモン プロセスには親 PID があり、親から子へのルールに従います。
  • SIGTERM/SIGKILL がプログラムに送信されるときに基礎となるプロセスがクラッシュする問題は、go-reap ライブラリでは再現できません。 .

免責事項

提供されるソリューションは、サブプロセスがゾンビになるのを防ぐ問題に対処することに重点を置いています。すべての要件に対処する完全なソリューションには、複数のアプローチの組み合わせが必要になる場合があります。

以上がGolang で長時間実行プロセスを実行し、ゾンビになるのを防ぐには?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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