crontab
Bei der Verwendung von Cron führen wir oft zu lange aus, weil ein bestimmter Befehl zu lange dauert, und wenn der Befehl erneut gestartet wird, werden mehrere Prozesse angezeigt.
Sie können Flock verwenden, wie zum Beispiel:
*/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'
Wenn mehrere Prozesse Operationen an denselben Daten ausführen können, müssen diese Prozesse sicherstellen, dass nicht auch andere Prozesse ausgeführt werden, um eine Beschädigung der Daten zu vermeiden.
Normalerweise verwendet ein solcher Prozess eine „Sperrdatei“, das heißt, er erstellt eine Datei, um anderen Prozessen mitzuteilen, dass er ausgeführt wird. Wenn die Existenz dieser Datei erkannt wird, wird davon ausgegangen, dass es sich um einen Prozess handelt, der dieselben Daten verarbeitet Arbeiten. Das Problem besteht darin, dass der Benutzer die Sperrdatei nur manuell bereinigen kann, wenn der Prozess versehentlich abbricht und die Sperrdatei nicht gelöscht wird.
Parameter
-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中执行其后的语句。
Beispiel
crontab verwendet Flock, um eine wiederholte Ausführung zu verhindern
0 23 * * * (flock -xn ./test.lock -c "sh /root/test.sh") #-n 为非阻塞模式