crontab
Lors de l'utilisation de cron, nous exécutons souvent trop longtemps car une certaine commande prend trop de temps, et lorsque la commande est redémarrée, plusieurs processus apparaîtront.
Vous pouvez utiliser flock, tel que :
*/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'
Lorsque plusieurs processus peuvent effectuer des opérations sur les mêmes données, ces processus doivent garantir que d'autres processus ne fonctionnent pas également pour éviter d'endommager les données.
Habituellement, un tel processus utilisera un "fichier de verrouillage", c'est-à-dire créera un fichier pour indiquer aux autres processus qu'il est en cours d'exécution. Si l'existence de ce fichier est détectée, on considère qu'un processus exploitant les mêmes données est. fonctionnement. Le problème est que si le processus s'arrête accidentellement et que le fichier de verrouillage n'est pas effacé, l'utilisateur ne peut le nettoyer que manuellement.
Paramètre
-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中执行其后的语句。
Exemple
crontab utilise flock pour empêcher les exécutions répétées
0 23 * * * (flock -xn ./test.lock -c "sh /root/test.sh") #-n 为非阻塞模式