Answers:
尽管它们相似,但用户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或其他环境变量设置为特殊值,它也将包含在命令中。
bash -lc
没有帮助。我现在可以手动设置PATH,但如果我安装了一些脚本,则希望它们在cronjobs中被识别而无需指定完整路径。我确定这是有可能的,并且bash -lc
正在寻求解决方案:)
如果您需要默认的系统范围的PATH和其他ENV变量(在/etc/profile.d中定义),只需输入以下内容:
* * * * * . /etc/profile; your cmd
可以在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
我遇到了同样的问题,我发现了在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
(我将程序设置为在每次重新启动时运行)