我从 crontab 运行脚本时遇到问题。经过一番研究,我明白问题是因为 PATH 参数不包含 /sbin。
我查看了 /etc/crontab 中包含的内容:
PATH=/sbin:/bin:/usr/sbin:/usr/bin
作为测试 - 打印 PATH 变量的简单 cron 作业:
* * * * * echo $PATH &> /root/TMP.log
输出是:
cat /root/TMP.log
/usr/bin:/bin
我不明白这种行为...如何设置 PATH 变量..?或者更好 - 如何添加路径?
答案1
虽然它们很相似,但用户 crontab(使用 crontab -e 编辑)与系统 crontab(通过编辑 /etc/crontab 编辑)不同,并且与系统 crontab 保持单独的路径。
系统 crontab 有 7 个字段,在命令前插入用户名。而用户 crontab 只有 6 个字段,在时间字段后直接插入命令。
同样,系统 crontab 中的 PATH 通常包含 /sbin 目录,而用户 crontab 中的 PATH 则不包含。如果要为用户crontab设置PATH,则需要在用户crontab中定义PATH变量。
在 cron 的 shell 命令中添加常规 PATH 的一个简单解决方法是通过在登录 shell 中运行 bash 让 cronjob 获取您的配置文件。例如代替
* * * * * some command
你可以改为运行
* * * * * bash -lc some command
这样,如果您的配置文件将 PATH 或其他环境变量设置为特殊的内容,它也会包含在您的命令中。
答案2
可以在 cronjob 行或单行中设置 PATH(或其他参数)。但你不能像PATH=$PATH:/usr/local/bin
.波形符 (~) 字符作为主目录的快捷方式适用于 MacOS,但似乎不适用于 Linux(至少对于 debian/buster)。
来自书籍:
crontab 中的活动行可以是环境设置,也可以是 cron 命令。环境设置的形式为:name = value,其中等号 (=) 周围的空格是可选的,value 中任何后续的非前导空格都是分配给 name 的值的一部分。值字符串可以放在引号中(单引号或双引号,但要匹配)以保留前导或尾随空格。
请参阅man 5 crontab
获取更多信息。
所以这应该有效:
PATH=/bin:/usr/bin:/my/path/bin
5 3 * * * command_that_requires_my_path
答案3
如果您需要默认的系统范围路径和其他 ENV 变量(在 /etc/profile.d 中定义),只需输入以下内容:
* * * * * . /etc/profile; your cmd
答案4
当你像这样扩展你的命令时,你可以让 cron 为你做一些日志记录:
例如每次在 XX:05 开火
5 * * * * /usr/bin/bash -x /path/to/script 2>&1 | tee -a /root/output.cron.txt
查看日志,看看 cron 遇到了什么问题。
迈克尔·HTH