如何设置crontab PATH变量


17

我在从crontab运行脚本时遇到问题。经过一些研究,我了解到问题是因为PATH参数不包含/ sbin。

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

PATH=/sbin:/bin:/usr/sbin:/usr/bin

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

* * * * * echo $PATH &> /root/TMP.log

输出为:

cat /root/TMP.log
/usr/bin:/bin

我不了解这种行为...如何设置PATH变量..?或更好-如何为其添加路径?

Answers:


17

尽管它们相似,但用户crontab(使用crontab -e编辑)与系统crontab(通过编辑/ etc / crontab编辑)不同,并且保持单独的路径。

系统crontab有7个字段,在命令前插入用户名。另一方面,用户crontab只有6个字段,紧随时间字段之后直接进入命令。

同样,系统crontab中的PATH通常包括/ sbin目录,而用户crontab中的PATH不包括。如果要为用户crontab设置PATH,则需要在用户crontab中定义PATH变量。


在cron的shell命令中添加常规PATH的一种简单的解决方法是,使cronjob通过在登录shell中运行bash来获取个人资料。例如代替

* * * * * some command

您可以改为运行

* * * * * bash -lc some command

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


谢谢,这可以解释它。但是用这种方法,我只能设置PATH,而不能编辑,因为PATH = / sbin:$ PATH或类似的方法不起作用。我尝试过...
csny 2014年

是的,在这种情况下,您需要从头开始定义PATH,这应该很容易,因为您知道crontab中运行的所有命令,因此只需要考虑这些即可。
2014年

@madumlao bash -lc没有帮助。我现在可以手动设置PATH,但如果我安装了一些脚本,则希望它们在cronjobs中被识别而无需指定完整路径。我确定这是有可能的,并且bash -lc正在寻求解决方案:)
csny14年

4
bash -lc启动一个登录外壳程序,该外壳程序将获取用户的个人资料。这意味着它使用〜/ .bash_profile,〜/ .profile或〜/ .bashrc中设置的PATH ...您在此处设置了路径吗?如果是这样,并且效果不好,请更新我的答案
madumlao 2014年

大。感谢Madunlao。在将bin文件夹手动添加到〜/ .bash_profile之后,我的cronjob运行良好。
张健健


3

可以在cronjob行或单行中设置PATH(或其他参数)。但是您不能使用像这样的shell扩展PATH=$PATH:/usr/local/bin。但是主目录快捷方式允许使用代字号。

从书中:

crontab中的活动行是环境设置或cron命令。环境设置的形式为:name = value,其中等号(=)周围的空白是可选的,并且值中任何后续的非前导空白都是分配给name的值的一部分。值字符串可以放在引号中(单引号或双引号,但匹配),以保留前导或尾随空白。

请参阅man 5 crontab以获取更多信息。

所以这应该工作:

PATH=/bin:/usr/bin:/my/path/bin
5 3 * * * command_that_requires_my_path

0

我遇到了同样的问题,我发现了在crontab中运行脚本的其他方法。我认为运行程序的最简单方法是制作一个可以CD到程序目录的脚本。然后在该脚本中调用您的程序。

这是一个脚本示例(脚本名称= launcher.sh):

#!bin/bash
cd /home/pi/test
sudo python3 example.py

然后,使您的脚本可执行:

chmod 755 launcher.sh

最后,将您的脚本添加到crontab

crontab -e

并在末尾添加以下行:

@reboot sh /home/pi/test/launcher.sh

(我将程序设置为在每次重新启动时运行)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.