web-dev-qa-db-ja.com

長時間実行されているプロセスがまだ進行中であることを確認し、そうでない場合は開始するためにcronジョブを設定する最良の方法は何ですか?

タイトルによると:

長時間実行されているプロセスがまだ進行中であることを確認し、そうでない場合は開始するためにcronジョブを設定する最良の方法は何ですか?

Cronで長時間実行プロセスを開始すると、ブロックされますか?または、cronは独立した子としてプロセスをフォークしますか?

ありがとう!

5
Ben

長時間実行されているプロセスがまだ進行中であることを確認し、そうでない場合は開始するためにcronジョブを設定する最良の方法は何ですか?

簡単なアプローチは、プロセスが実行されているかどうかをチェックし、必要に応じて再起動する簡単なスクリプトを用意することです。

(プロセスが「ダミートランザクション」を使用して実行されていることを実際に検証するのが最善の場合もあります。たとえば、SMTPプロセスを検証するには、TCPポート接続を行い、正しく応答することを確認します。 )

ただし、対話型ユーザーとしての環境と、cron(8)がスクリプトを実行するときの環境の違いに注意してください。

あなたの質問の2番目のビットに答えるには:

Cronで長時間実行プロセスを開始すると、ブロックされますか?または、cronは独立した子としてプロセスをフォークしますか?

cron(8)はcronジョブを実行するためにフォークしますが、スクリプトまたはプロセスが「デタッチ」しない限り、cronは終了するまで子プロセスとしてそれを維持します(これにより、cronはstderrからすべての出力を収集し、経由で送信できます) Eメール。)

しかし、あなたは考えていたと思いますが、実際にcronから長時間実行されるプロセスを実行できますか?その場合は、それ自体のコピーを1つしか開始できないこと、およびすでに実行されている場合はすぐに終了することを確認する必要があります。

長時間実行されるプロセスを実行し続けるためのより良いソリューション-終了またはクラッシュのみが心配な場合

  • プロセスを接続したままにすることができる場合は、inittab(5)および「respawn」オプションを介してinit(1)を使用します。多くの場合、デーモンでさえ「フォークなし」オプションがあります。
  • または、OSにinittab機能がない場合、またはOSにアクセスできない場合は、DJBの daemontools のようなものを使用してください。
  • solaris 10またはOpenSolarisを使用する余裕がある場合は、SMFを使用できます。 (これは、フォークとデタッチを行うプロセスでも機能します。)
  • 独自のコードの場合は、プロセスの親子ペアを持つように記述できます。この場合、親はSIGCHLDを受信するたびに子を再起動します。
5
jrg

一般的なイディオムは、長時間実行されるプロセスがpidファイルを持つことです。基本的に、プログラムのpidまたはプロセスIDを含む/var/runまたは同様のファイル。プログラムが起動するとファイルをそこに置き、停止するとファイルを削除します。そのファイルがそこにあるかどうかを確認することで、プログラムがそこにあることを簡単に確認できます。

これは、プログラムがクラッシュしたかどうかを確認するためにも使用できます。ファイルが存在するが、そのpidで実行されているプロセスがない場合、プログラムは停止しましたが、pidファイルを削除しませんでした。つまり、クラッシュしました。この場合、pidファイルを削除してプログラムを再起動できます。ただし、元のプロセスがクラッシュした後に開始された新しいプロセスによってPIDが再利用されることがあるため、これは絶対確実ではありません。

4
Rory

プロセスをどのように検出するかによって、cronジョブは次のようになります。

* * * * * pidof実行可能ファイル||/usr/local/bin/executeable

ただし、実行可能ファイルがプロセスリストに表示されている場合。より賢明な方法は、pidfileを用意し、start-stop-daemonを使用することです。実際、それはすべて問題のプロセスに依存します。少し前に、私は小さなプロセス保守デーモンも作成しました dudki まさにこの目的のために。

いいえ、cronはブロックしませんが、プロセスの性質によっては、とにかくバックグラウンドにすることをお勧めします。

「長時間実行」とは、実行に時間がかかるもの、または継続的に実行する必要があるデーモンを意味しますか?

完了するまでに長い時間がかかるプロセスを意味する場合は、提案されているように、プロセスにpidファイルを作成させ、起動時にそのファイルを探します。ファイルが存在する場合は、メッセージを吐き出し、きれいに終了します。それ以外の場合は、通常どおり起動します。

デーモン(サービスと呼ばれることもあります)を意味する場合は、cronを使用する代わりに、 ps-watcher を確認する必要があります。同じことを行うために使用します。

Webサイトから:「...デーモンが実行されているか、実行回数が多すぎないことを確認するために使用できます。また、メモリリークが原因で、プロセスがリソースを消費しすぎた時期を判断するためにも使用できます。 。」

プロセスを探すようにps-watcherを設定するだけです。 ps-watcherはプロセスリストをチェックし、見つからない場合はps-watcherが自動的に開始します。

1
David

monit はこの問題を解決するために設計されました。

0
Cawflands