cronにアプリを実行するように指示する方法はありますか?しかし、プロセスが既に存在する場合は実行しないでください。
cronにアプリを実行するように指示する方法はありますか?しかし、プロセスが既に存在する場合は実行しないでください。
回答:
最も簡単な方法は、pgrepを使用することです
crontab:
* * * * * pgrep processname > /dev/null || /path/to/processname -args0 -args1
export DISPLAY=:0
を防ぐために先頭にを付けCould not connect to display
ます。* * * * * export DISPLAY=:0 && 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
pgrep myprog; if [ $? -ne 0 ]; then ...
より良いように記述されるだろうif ! pgrep myprog; then ...
$?
ます。たとえば、ログメッセージを追加したり、行間にエラー処理を追加したりすることで、意図せずにの値を混乱させるのは簡単です。
前のインスタンスが完了していない場合、このスクリプトは再度実行されません。別の特定のプロセスが実行されているときに何かを実行したくない場合は、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
*/5 * * * * root flock /run/shm rsync -auhx --numeric-ids -e "ssh -T -c arcfour128 -o Compression=no -x" [source] [user]@[host]:[dest]
これは通常、ではなくプログラム自体によって処理され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は返されません。