Linux

root cron中的flock命令不會執行

  • August 14, 2020

我在rootDebian 的 crontab中有以下程式碼

* * * * * flock -xn /absolute/path/to/run.lock -c cd /absolute/parth/to/project && ./run >> run.log

但我沒有看到我指定它們的文件run.logrun.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此處的命令也不會對命令的工作目錄產生任何影響,也不會對flockshell 的第一個實例執行的第二個命令產生影響。**這是因為該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在項目目錄中執行之前有意義地執行。

引用自:https://unix.stackexchange.com/questions/603894