
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
答案1
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
在專案目錄中運行之前有意義地執行。