root cron中的flock命令不會執行
我在
root
Debian 的 crontab中有以下程式碼* * * * * flock -xn /absolute/path/to/run.lock -c cd /absolute/parth/to/project && ./run >> run.log
但我沒有看到我指定它們的文件
run.log
。run.lock
事實上,沒有證據表明該腳本已被執行。執行
ps aux | grep run
只會產生該grep
呼叫。如何在根目錄中執行
run
腳本?flock``crontab
crontab 行中的命令沒有按照您期望的方式進行解析。
cron 守護程序將使用為相關使用者配置的 shell 執行命令。
第一個 shell 將看到兩個命令,由
&&
控制運算符分隔。因此,僅當第一個命令以零返回碼退出時才執行第二個命令,表示成功。第一個命令是:
flock -xn /absolute/path/to/run.lock -c cd /absolute/path/to/project
.第二個命令是:
./run >> run.log
.第一個命令將創建鎖定文件並將命令
cd
作為子程序執行,即在 shell 的另一個實例中執行。不帶參數的cd
命令將更改為使用者的主目錄,之後執行的 shellflock
將立即退出。這將完全沒有效果。**即使使用路徑名,
cd /absolute/path/to/project
此處的命令也不會對命令的工作目錄產生任何影響,也不會對flock
shell 的第一個實例執行的第二個命令產生影響。**這是因為該cd
命令只影響執行它的特定 shell 實例,而不影響它的父級。被
/absolute/path/to/project
視為flock
命令的額外文件名,而不是cd
.由於第一個命令已退出並且沒有報告任何錯誤,因此 shell 的第一個實例(最初由
cron
守護程序啟動)現在將執行第二個命令。由於該 shell 的工作目錄沒有改變,它仍然是root
使用者的主目錄,所以它最終會嘗試執行有效的/root/run >>/root/run.log
.我的猜測是你可能是這樣的:
* * * * * flock -xn /absolute/path/to/run.lock -c "cd /absolute/path/to/project && ./run >> run.log"
引號將阻止第一個 shell 在 處拆分命令行
&&
,因此第二個 shell(由flock
命令啟動)將獲得整個剩餘的命令行,因此該cd /absolute/path/to/project
命令將./run
在項目目錄中執行之前有意義地執行。