root cron 中的叢集指令不會執行

root cron 中的叢集指令不會執行

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腳本?flockcrontab

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

相關內容