*/1 * * * * flock -xn ./flock.lock -c "php -r \"sleep(120);\"" && rm ./flock.lock
注:咱们担忧常驻进程(死循环)运行时出现不知名错误,而致使进程中断执行,经过crontab+flock保证常驻进程的中断以后重启php
flock -xn ./flock.lock -c "php -r \"sleep(20);\"" && rm ./flock.lock
这条命令,第一次执行,能够发现几点html
命令行会等待20s而后结束linux
命令回车执行以后,生成了flock.lock
文件shell
20s等待完毕以后flock.lock
文件被删除命令行
在这20s等待期间,ps -ef | grep php
会出现两个相关进程,一个是php执行进程,一个是flock锁进程code
在这20s等待期间,重复运行该命令,进程数量并不会增长htm
-s, --shared: 得到一个共享锁 -x, -e, --exclusive: 得到一个独占锁(排它锁) -u, --unlock: 移除一个锁,一般是不须要的,脚本执行完会自动丢弃锁 -n, --nonblock: 若是没有当即得到锁,直接失败而不是等待 -w, --timeout: 若是没有当即得到锁,等待指定时间 -o, --close: 在运行命令前关闭文件的描述符号。用于若是命令产生子进程时会不受锁的管控 -c, --command: 在shell中运行一个单独的命令 -h, --help 显示帮助 -V, --version: 显示版本
答: 前段命令会等待 -c 后面的命令执行结束,即: php -r "sleep(20);"进程
flock.lock
文件?答: flock 会先建立一个文件,再获取该文件的相关锁(独占锁、共享锁、排他锁)crontab
flock.lock
文件被删除?答: 前面的命令执行成功,执行下一步命令get
关于&&
的用法请阅读《Shell 基本运算符》
答: flock进程在等待php进程执行完成
答: 第一个flock 进程已经拿到了文件flock.lock的独占锁,后面重复执行命令,获取锁失败(与flock -n的参数指令相关),执行失败后,天然不会进行下一步
注:flock.lock文件可不删除,flock只会获取文件锁,跟文件是否存在无关(文件不存在会自动建立文件
)