cron、毎分RAMの問題

cron、毎分RAMの問題

wordpress cron.phpファイルからPHPを実行するcronjobがあります。これは主にリリーススケジュールをキャッチするために使用され、キャッシュをフラッシュすることもできると思います。

毎分 cron ジョブを実行します。私は定期的にpsをチェックし、cron.phpを実行している2つのPHPインスタンスを見ました。これでインスタンスを実行すると、必要なすべてのタスクが実行されるため、これは必要ありません。メモリをチェックするもう1つの作業がありますが、時にはメモリの競合を引き起こす2つのインスタンスがあります(常に使用可能なメモリがたくさんあり、メモリを減らすことはできますが、そうしたくありません)。私は仕事が1分以上かかるとは思えません(可能であっても)。

プロセスがすでに存在する場合は、どのようにタスクを実行できますか?データベースに接続/使用しないと、PHPコード自体をチェックできないと思いますか?使用できるcronコマンドはありますか? 1分以上インスタンスを終了したくありません。新しいものを作成しないでください。

答え1

これは単純なbashスクリプトソリューションです。 cron.phpスクリプトでも同じことができます。実際には、長すぎる実行されているプロセスを確認してください。これは自動化されたシステムにとって良いアイデアかもしれません。

#!/bin/bash

# Exit if process is already running
if test -e /tmp/wordpress-job.pid; then
  # Check if the pid that was stored in /tmp/wordpress-job.pid does exist
  if ps ax -o pid= | grep $(cat /tmp/wordpress-job.pid ) &> /dev/null; then
    exit 0
  fi
fi

# Create the file that marks this process as running
echo $$ > /tmp/wordpress-job.pid

# Some extra security check to prevent the pid file
# to survive.
trap "rm -f /tmp/wordpress-job.pid" EXIT TERM INT HUP 

# Start the long-running process in the background
sleep 3600 & # long-running process

# Sleep some time before trying to kill that process
sleep 300

# Kill job if it takes longer than it should
kill %1

# Delete the file that marks this process as running
rm -f /tmp/wordpress-job.pid

「sleep 3600」をphpコマンドラインに置き換え、以下の300をスクリプトの実行が許可される最大時間に変更する必要があります。

答え2

crontabエントリを実行します。

if mv /var/run/my-php-job.pending /var/run/my-php-job.running 2>/dev/null; then
  echo $$ >|/var/run/my-php-job.running   # optional
  … # run the job
  : >|/var/run/my-php-job.running         # optional
  mv /var/run/my-php-job.running /var/run/my-php-job.pending
fi

これを@rebootcrontabエントリに入れてください:

rm -f /var/run/my-php-job.running
touch /var/run/my-php-job.pending

ファイル名はロックとして機能します。その間、.runningジョブは実行中であり、次のジョブは開始されません。これ.pendingにより、実行中のジョブが開始され、に切り替わります.running

.runningオプションの行が含まれている場合ジョブが中断された場合は、調査のためにシェルのプロセスIDがファイルに書き込まれます。ログファイルはこれを重複させます。

ジョブが実行されているシェルがクラッシュした場合(誰かが故意にジョブを終了するか、メモリが不足している場合にのみ発生します)、ロックファイルが中断されます(ジョブ自体がクラッシュした場合は.running疑いの余地はありません)、古いスクリプトの突然の終了を検出しましたできますが、はるかに難しいです。

答え3

並列実行を避けるための特別なユーティリティがあります。util-linuxのFlock、BSDシステムのlockf、NetBSDのshlock、INN、およびcnewsパッケージ。

最も可能性の高いケース(Linux)の場合、呼び出しは次のとおりです。

flock -w 60 /somedir/lockfile cron.php

他の回答のレシピは基本的な群れを置き換え、そのようなツールがない場合にのみ便利です。

OTOH、プログラムはこれらのロックを直接処理できますが、すべての詳細を繰り返すように注意する必要があります。そうしないと、競合状態が発生する可能性があります。

関連情報