Cronにアプリを実行するように指示する方法はありますが、プロセスがすでに存在する場合は実行しないでください。
最も簡単な方法は、pgrepを使用することです
crontab:
* * * * * pgrep processname > /dev/null || /path/to/processname -args0 -args1
プログラムを直接実行するのではなく、スクリプトを実行します。多くの可能性があります。例えば :
MYPROG="myprog"
RESTART="myprog params"
PGREP="/usr/bin/pgrep"
# find myprog pid
$PGREP ${MYPROG}
# if not running
if [ $? -ne 0 ]
then
$RESTART
fi
前のインスタンスが完了していない場合、このスクリプトは再度実行されません。別の特定のプロセスが実行されているときに何かを実行したくない場合は、harrymcのスクリプトを参照してください。
DATE=`date +%c`;
ME=`basename "$0"`;
LCK="./${ME}.LCK";
exec 8>$LCK;
if flock -n -x 8; then
echo ""
echo "Starting your script..."
echo ""
[PUT YOUR STUFF HERE]
echo ""
echo "Script started $DATE";
echo "Script finished `date +%c`";
else
echo "Script NOT started - previous one still running at $DATE";
fi
これは通常、cron
ではなくプログラム自体によって処理されます。これには2つの標準的な手法があります。
1)grep
ps
の出力により、その名前のプロセスがすでに実行されているかどうかを確認します
2)起動時に、最初にpid(プロセスID)ファイルの存在を確認します。通常は/var/run/program_name.pid
にあります。存在する場合は、ファイルからpidを読み取り、そのプロセスがまだ存在するかどうかを確認します。ある場合は、開始を拒否します。 pidファイルが存在しないか、ファイル内のpidがなくなっている場合は、pidファイルを作成し、そこにプロセスIDを書き込んで、通常の起動を続行します。
これらのいずれかを直接実行するbashパイプをcrontabに書き込むことは技術的に可能ですが、開始するプログラムに追加するか(開始方法に関係なく適用されるようにする)、またはラッパースクリプトを作成することをお勧めしますハリーマックが示唆したように、これを処理します。
* * * * * pgrep -f "[p]attern" > /dev/null || /path/to/processname -args0 -args1
上記の回答を再利用して、パターンマッチングを改善しました。 fオプションのないpgrepはプロセスパターンと一致しません。しかし、fオプションの使用には問題があります。 fオプションを使用すると、cronを生成するシェルは常に一致し、そのpidを返すため、プロセスは再起動されません。
文字パターンの1つに[]を追加すると、プロセスのみに一致し、cronシェルのpidは返されません。