为什么 cron 尝试更改到用户的主目录以及如何避免这种情况?

Vse*_*lod 4 linux cron centos

我在 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 忘记主目录?为什么它要顺便寻找它?

thr*_*rig 5

假设文档是坏的或错误的,源代码潜水:

% 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
Run Code Online (Sandbox Code Playgroud)

...一些 altagoobingleduck 来到这里,因为 RPM 中的 URL 已损坏...

% git clone https://github.com/cronie-crond/cronie && cd cronie
% fgrep -rl 'chdir failed' .
./src/security.c
Run Code Online (Sandbox Code Playgroud)

...因此该错误仅出现在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) {
Run Code Online (Sandbox Code Playgroud)

...因此在所有情况下,HOME环境变量似乎都用于确定chdir用户的位置,并且chdir该目录始终有一个。因此,您需要确保该HOME目录存在,或者在调用之前HOME正确设置该目录(这可能发生在您的 cron 作业中的 shell 代码被查看之前)。(或者用猴子补丁做其他事情,但这可能是一个非常糟糕的主意。) cron_change_user_permanentlycronie