*/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只會獲取文件鎖,跟文件是否存在無關(文件不存在會自動建立文件
)