0

今日、一部の cron が正常に実行されていないことに気付きました。ログ ファイルに次のエラー行が記録されていることに気付きました。

/bin/sh: fork: Resource temporarily unavailable

いくつかの調査を行ったところ、ユーザーが実行できるプロセスの数に関係している可能性があることがわかりました。

次に実行します:

top -u

実際、そこにあるべきではないと私が考えるプロセスがたくさんshあります。curl

ほとんどのプロセスは、phpいくつかの DB メンテナンス タスクを実行するローカル ファイルへの単純な呼び出しです。

すべてのプロセスがローカル マシンで実行されているため、すべてに完全にアクセスできます。方法がわかれば制限を変更したいのですが、特に Mac OS X Lion でこの問題に関連する情報を見つけることができません。

また、実行後にプロセスが消えない理由もわかりません。

実行後にプロセスを強制終了する方法はありますか?

正しい方向へのヒントは大歓迎です!ありがとう

4

1 に答える 1

1

あなたができる唯一の正しいことは、ロックファイルを使用して、特定のcronジョブごとに実行されているインスタンスが1つだけであることを保証することです。これを行う最も簡単な方法は、cronスクリプト内からロックファイルを使用することです。(「協調ロック」):

  • 起動時に、(cron)ジョブはロックファイルが存在するかどうかをテストします
  • ロックファイルが存在する場合、ジョブはkill -0 <pid>他のプロセスでを実行します(#1)
  • killからのエラーコードがゼロの場合、プロセスは実際に存在し、同じユーザーIDからのものです。新しいジョブは終了するはずです。(#2)
  • キルからのエラーコードがゼロでない場合、プロセスはもう存在しない(良好)か、別のuidの別の(無関係な)プロセスに属しています。
  • プロセスが存在しない場合は、ロックファイルを作成し、そのpidをそのプロセスに書き込むことで新しいジョブを続行できます(#3)
  • これで、実際のペイロードを実行できます
  • 最後に、ロックファイルを削除できます。

#1:kill -0何もしません。pidの有効性をチェックするだけです

#2:pidが私たちのpidの無関係なプロセスに属している可能性はわずかです。psの出力を調べ、pidが実際にcronジョブの古いインスタンスに属しているかどうかを確認することで、検索を絞り込むことができます。

#3:これはレースフリーではありませんが、1分に1回実行されるcronジョブの場合は、おそらく十分です。

于 2012-01-07T13:05:40.677 に答える