我在 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
条目时crontab
,cron
已尝试更改为 ${HOME}。