我在从 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 或其他环境变量设置为特殊的东西,它也会包含在您的命令中。
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)
| 归档时间: |
|
| 查看次数: |
67890 次 |
| 最近记录: |