如何设置 crontab PATH 变量

如何设置 crontab PATH 变量

我从 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

相关内容