crontab
cron を使用する場合、特定のコマンドの実行に時間がかかりすぎるため、コマンドを再度開始するときに複数のプロセスが発生することがよくあります。
flock は次のように使用できます。
*/1 * * * * flock -xn /opt/app/nginx/test_repo/app/tasks/checkPaymentUrl.lock -c 'sudo -u apache php /opt/app/nginx/test_repo/app/console Payment checkPaymentUrl >> /dev/null 2>&1'
複数のプロセスが同じデータに対して操作を実行する可能性がある場合、これらのプロセスは、データの損傷を避けるために、他のプロセスも同時に操作されていないことを確認する必要があります。
通常、このようなプロセスは「ロック ファイル」を使用します。つまり、他のプロセスに実行中であることを知らせるためにファイルを作成します。そのファイルの存在が検出された場合、プロセスが動作していると見なされます。同じデータが動作しています。問題は、プロセスが誤って終了し、ロック ファイルがクリアされなかった場合、ユーザーは手動でしかクリーンアップできないことです。
パラメータ
-s,--shared:获取一个共享锁,在定向为某文件的FD上设置共享锁而未释放锁的时间内,其他进程试图在定向为此文件的FD上设置独占锁的请求失败,而其他进程试图在定向为此文件的FD上设置共享锁的请求会成功。 -x,-e,--exclusive:获取一个排它锁,或者称为写入锁,为默认项。 -u,--unlock:手动释放锁,一般情况不必须,当FD关闭时,系统会自动解锁,此参数用于脚本命令一部分需要异步执行,一部分可以同步执行的情况。 -n,--nb, --nonblock:非阻塞模式,当获取锁失败时,返回1而不是等待。 -w, --wait, --timeout seconds:设置阻塞超时,当超过设置的秒数时,退出阻塞模式,返回1,并继续执行后面的语句。 -o, --close:表示当执行command前关闭设置锁的FD,以使command的子进程不保持锁。 -c, --command command:在shell中执行其后的语句。
例
crontabはflockを使用して繰り返し実行を防止します
0 23 * * * (flock -xn ./test.lock -c "sh /root/test.sh") #-n 为非阻塞模式