如何设置 crontab PATH 变量

csn*_*sny 37 cron centos path

我在从 crontab 运行脚本时遇到问题。经过一番研究,我明白这个问题是因为 PATH 参数不包含 /sbin。

我查看了 /etc/crontab 中包含的内容:

PATH=/sbin:/bin:/usr/sbin:/usr/bin
Run Code Online (Sandbox Code Playgroud)

作为测试 - 打印 PATH 变量的简单 cron 作业:

* * * * * echo $PATH &> /root/TMP.log
Run Code Online (Sandbox Code Playgroud)

输出是:

cat /root/TMP.log
/usr/bin:/bin
Run Code Online (Sandbox Code Playgroud)

我不明白这种行为...如何设置 PATH 变量..?或者更好 - 如何向它添加路径?

mad*_*lao 37

虽然它们很相似,但用户 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
Run Code Online (Sandbox Code Playgroud)

你可以运行

* * * * * bash -lc some command
Run Code Online (Sandbox Code Playgroud)

这样,如果您的配置文件将 PATH 或其他环境变量设置为特殊的东西,它也会包含在您的命令中。

  • bash -lc 启动一个登录shell,它提供您用户的配置文件。这意味着它使用在 ~/.bash_profile、~/.profile 或 ~/.bashrc 中设置的 PATH... 你在那里设置了路径吗?如果是这样并且效果不佳,请更新我的答案 (4认同)
  • 谢谢,这解释了它......但是这样我只能设置 PATH,而不能编辑,因为 PATH=/sbin:$PATH 或类似的不起作用。我试过... (2认同)

its*_*ire 21

可以在 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
Run Code Online (Sandbox Code Playgroud)


小智 8

如果您需要默认的系统范围的 PATH 和其他 ENV 变量(在 /etc/profile.d 中定义),只需输入以下内容:

* * * * * . /etc/profile; your cmd
Run Code Online (Sandbox Code Playgroud)