
私のウェブサイトを更新するために毎分php5 wp-cron.phpを実行しているcronjobがあります。
ただし、問題が発生し、そのインスタンスが30を超えました(このダンプには31で示されていますps aux
)。それは私のメモリを消費し、メモリ不足のために追加のdoインスタンスを終了させ、ボックスにSSHを接続するのを防ぎます。
インスタンスの寿命が30分を超える理由を理解できません。インスタンスは通常数秒かかります。私はそれが起こった日に何も計画しませんでした。 (もちろんwpキャッシュがそれを使ったかもしれませんが、以前は問題ありませんでした)
cronjobがスパムを送信してメモリを損傷するのを防ぐにはどうすればよいですか?インスタンスがまだ生きている場合、インスタンスを起動しないようにする方法はありますか?インスタンスが5分以上生き残ると終了しますか?
このようなことが起こらないように自分自身を保護する方法はありますか?
答え1
私の考えであなたが最初にしなければならないことは、これを起こした犯人を扇動することです。通常、これはプログラムがある時点で中断される可能性があるため、Webサイトが正常に更新されたくない限り、この問題をデバッグして修正する必要があります。
「インスタンスが生きていれば始めないように言うことができますか?」にはいくつかの方法があります。そのうちの1つはpgrep yourprogramname
インスタンスがすでに存在することを確認し、その場合はすべてpkill -x yourprogramname
終了を呼び出すことができます。
答え2
ターゲットの複数のコピーが実行されるのを防ぐために、Flock(Linux)、lockf(FreeBSD)、およびshlock(信頼性の低い一部のシステムによって提供されます)を使用できます。これは実行時間を制限しませんが、1つのプロセスのみが実行されることを保証します。その後、中断したら、その状態を動的に分析できます。
ulimitシェル組み込みコマンドを使用して、生成プロセスのCPU時間を制限できます。
停止時間を制限するには、プロセスが終了するのを待ってから、タイムアウト後にプロセスを終了するスクリプトを作成できます。 Python/Perl/etcでは簡単です。ただし、シェルではこれも許可します(トラップおよび/または背景サブキーを使用)。
場合によっては、cronのようにstartを呼び出すのではなく、呼び出しの間に一定の時間(つまり、前の呼び出しの終わりから次の呼び出しの開始まで)を提供すると便利です。通常のcronではこれを許可しないため、特別なスクリプトを実行する必要があります。