使用 cron 运行脚本时,内部调用的任何可执行文件都必须具有完整路径。我在尝试运行wondershaper时发现了这个,当它尝试调用 tc. 所以我的问题是,克服这个问题的正确方法是什么?
可能的解决方案:
- cd 到可执行文件夹并准备符号链接到那里的任何其他调用的可执行文件(不确定它是否有效 - 可移植性低)
- 在脚本中使用完整路径(它可以工作 - 跨不同发行版的可移植性低)
- 在脚本中导出具有所需路径的路径变量(不确定它是否有效)
好吧,提前感谢任何人的帮助。
如果你在 linux/bsd/mac 上,你可以设置一些环境变量,比如PATH
在 中crontab
,这样你通常就可以了。
如果你在 Solaris 上,那么,我为你祈祷。但是,我也有一个答案:我通常会.profile
在运行任何东西之前进行采购:
0 0 * * 0 . /home/myuser/.profile && cd /path && ./script
请注意,我的.profile
负载.bash_profile
和.bashrc
. 只要确保您来源的任何文件都有您需要的东西。
由于 cron 不运行登录,因此 .profile 和 /etc/profile 没有来源。因此 PATH 可能未设置为您期望的值。我要么
您使用符号链接的技巧假设 . 在 PATH 中,只是看起来不太好
在您的 cron 作业中声明变量更加明确且更易于维护:您需要修改的所有内容都包含在您的 cron 作业中,如果您将其移动到另一个系统,则无需传输多个文件。
PATH=/usr/bin:/your/fancy/dir
MYAPPROOT=/var/lib/myapp
*/2 * * * * myappinpath
*/3 * * * * $MYAPPROOT/mylocalapp
我的建议:
在外部文件中设置所有变量。我使用位于 /etc/process_name 或类似文件中的“process_name.env”文件。假设您有一个备份脚本。那么你:
修改您的备份脚本并在Shebang之后添加此行:
. /etc/backup.env #备份环境的完整路径前有一个点和一个空格。
IMO 这种方法比在 CRON 定义中声明变量更好,因为:
问候