CRONにて多重起動時に通知

【概要】
CRONでスクリプト定期実行時にて、
すでに起動しているプロセスがあり、
多重起動となる場合は多重実行せず、シスログ通知させる設定です。

【動作確認した環境】
CentOS7.4

【設定内容】
CRON設定

run_sh=<スクリプトフルパス>

* * * * (/usr/sbin/pidof -x ${run_sh} >/dev/null 2>&1 && /usr/bin/logger "<通知メッセージ>") || ${run_sh} >/dev/null 2>&1

CRON設定例) ※スクリプト実行失敗時のlogger処理も追加しています。

run_sh=/home/test/aaa.sh

45 23 * * * (/usr/sbin/pidof -x ${run_sh} >/dev/null 2>&1 && /usr/bin/logger "${run_sh} Already running.") || ${run_sh} >/dev/null 2>&1 || /usr/bin/logger "${run_sh} Run failed."

【説明】
「pidof」コマンドでスクリプトのプロセスがある場合(&&)、Syslog(/var/log/message)にメッセージ出力します。
括弧内のコマンドがfalseの場合(||)、スクリプトを実行します。

【注意点】
(1) CRONのコマンドはフルパスで指定するので、
フルパスで実行されたもののみ重複判定されるようです。
スクリプトを手動実行した場合だと重複起動とみなされません。

例1:CRONで「/home/test/aaa.sh」指定だと、「sh aaa.sh」や「./aaa.sh」での手動実行は重複扱いにならない
例2:「/home/test/aaa.sh」と「./aaa.sh」だと「/usr/sbin/pidof -x aaa.sh」だとうまくいく。「/usr/sbin/pidof -x /home/test/aaa.sh」だとうまくいかない
例3:「sh aaa.sh」だと「/usr/sbin/pidof -x aaa.sh」でもうまくいかない

(2) pidofの指定は引数を含まないコマンド扱いのようです。

例1:「/usr/sbin/pidof -x “/home/test/aaa.sh bbb”」だとうまくいかない
例2:「/home/test/aaa.sh bbb」実行でも「/usr/sbin/pidof -x “/home/test/aaa.sh”」だとうまくいく

(3) 「>/dev/null 2>&1」はコマンド実行結果を削除している処理のため、 スクリプトの実行ログなどはスクリプト内に記載が必要です。

(4) 処理の欠点として、多重起動検知時にloggerコマンド結果がNG(パスやスペルが誤っている場合など)だと、 スクリプト起動処理が走ってしまいます。

【参考にしたサイト】
下記サイトを拝見しました。ありがとうございました。

・[一番簡単かも]cron起動プロセスの多重起動防止ワンライナー
 https://qiita.com/meguroman/items/517f22f68b9235163036