Linux

為什麼 cron 試圖更改到使用者的主目錄以及如何避免這種情況?

  • May 8, 2018

我在我的 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

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