為什麼 cron 試圖更改到使用者的主目錄以及如何避免這種情況?
我在我的 centos 7 上為 cronjob 創建了新的系統帳戶,並為它設置了一個 cronjob。
但是我的 cronjob 無法執行並出現錯誤:
(CRON) ERROR chdir failed (/home/sysagent): No such file or directory
目前 sysagent 帳戶的 crontab 如下所示:
15 16 * * * HOME="/tmp" && cd path/to/project_folder && ./src/mainroutine.sh | ts "[\%Y-\%m-\%d \%H:\%M:\%S]" >> /var/log/automation/sysagent.log
經過一番調查後,我已經將 HOME 變數和 cd 添加到項目文件夾中(曾經在那裡有 shell 腳本的完整路徑),但這沒有幫助。如何讓 cronjob 忘記主目錄?以及它為什麼要順便尋找它?
假設文件是壞的或錯誤的,原始碼潛水:
% rpm -qa | grep cron cronie-1.4.11-17.el7.x86_64 cronie-anacron-1.4.11-17.el7.x86_64 crontabs-1.11-6.20121102git.el7.noarch
… 一些 altagoobingleduckgoing 在這裡,因為 RPM 中的 URL 已損壞…
% git clone https://github.com/cronie-crond/cronie && cd cronie % fgrep -rl 'chdir failed' . ./src/security.c
…因此錯誤只出現在一個地方,在
cron_change_user_permanently
程式碼中從其他各個地方呼叫的呼叫中…% grep cron_change_user_permanently **/*.c src/do_command.c: if (cron_change_user_permanently(e->pwd, env_get("HOME", jobenv)) < 0) src/do_command.c: if (cron_change_user_permanently(e->pwd, env_get("HOME", jobenv)) < 0) src/popen.c: if (cron_change_user_permanently(pw, env_get("HOME", jobenv)) != 0) src/security.c:int cron_change_user_permanently(struct passwd *pw, char *homedir) {
…因此,在所有情況下,
HOME
環境變數似乎都用於確定chdir
使用者的去向,並且該目錄總是有一個chdir
。因此,您需要確保該HOME
目錄存在,或者在呼叫之前HOME
正確設置(這可能發生在您的 cron 作業中的 shell 程式碼甚至被查看之前)。(或者用猴子更新檔做其他事情,但這可能是一個非常糟糕的主意。)cron_change_user_permanently``cronie