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

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

答案1

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

% 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

...一些 altagoobingleduck 来到这里,因为 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_change_user_permanently被调用(这可能发生在你的 cron 作业中的 shell 代码被查看之前)。 (或者猴子补丁cronie来做其他事情,但这可能是一个非常非常糟糕的主意。)

答案2

cron运行用户的时crontab,它将希望在用户的主目录中启动。该变量的初始值来自/etc/passwd(在简单情况下)。当您尝试覆盖HOME条目时crontabcron已尝试更改为 ${HOME}。

相关内容