3

使用 cron 运行脚本时,内部调用的任何可执行文件都必须具有完整路径。我在尝试运行wondershaper时发现了这个,当它尝试调用 tc. 所以我的问题是,克服这个问题的正确方法是什么?

可能的解决方案:

  • cd 到可执行文件夹并准备符号链接到那里的任何其他调用的可执行文件(不确定它是否有效 - 可移植性低)
  • 在脚本中使用完整路径(它可以工作 - 跨不同发行版的可移植性低)
  • 在脚本中导出具有所需路径的路径变量(不确定它是否有效)

好吧,提前感谢任何人的帮助。

4

4 回答 4

4

如果你在 linux/bsd/mac 上,你可以设置一些环境变量,比如PATH在 中crontab,这样你通常就可以了。

如果你在 Solaris 上,那么,我为你祈祷。但是,我也有一个答案:我通常会.profile在运行任何东西之前进行采购:

0 0 * * 0 . /home/myuser/.profile && cd /path && ./script

请注意,我的.profile负载.bash_profile.bashrc. 只要确保您来源的任何文件都有您需要的东西。

于 2009-05-04T13:49:39.280 回答
3

由于 cron 不运行登录,因此 .profile 和 /etc/profile 没有来源。因此 PATH 可能未设置为您期望的值。我要么

  • 将 PATH 设置并导出为适当的值
  • 在脚本中使用完整路径

您使用符号链接的技巧假设 . 在 PATH 中,只是看起来不太好

于 2009-05-04T13:50:44.460 回答
3

在您的 cron 作业中声明变量更加明确且更易于维护:您需要修改的所有内容都包含在您的 cron 作业中,如果您将其移动到另一个系统,则无需传输多个文件。

PATH=/usr/bin:/your/fancy/dir
MYAPPROOT=/var/lib/myapp

*/2 * * * * myappinpath
*/3 * * * * $MYAPPROOT/mylocalapp
于 2009-05-04T14:00:40.533 回答
1

我的建议:

在外部文件中设置所有变量。我使用位于 /etc/process_name 或类似文件中的“process_name.env”文件。假设您有一个备份脚本。那么你:

  • 创建 /etc/backup.env 并放置执行“备份”任务所需的所有环境变量。
  • 修改您的备份脚本并在Shebang之后添加此行:

    . /etc/backup.env #备份环境的完整路径前有一个点和一个空格。

IMO 这种方法比在 CRON 定义中声明变量更好,因为:

  • 易于维护。只需编辑一个文件。
  • 易于切换配置/集中配置:
    • 您可以有多个 .env 用于在不同情况下使用您的脚本(例如,假设您在 .env 上有备份位置,您可以将 .env 位置作为参数传递并每天运行您的 cron 作业,提供一个位置很少的 .env 和每周通过提供另一个 .env 提供不同的位置,这只是一个示例)。
  • 您可以将 .env 文件保存在 SVN 或 Git 等 VCS 中。
  • 测试您的脚本非常容易(无需从 CRON 执行它)。

问候

于 2009-05-05T13:37:18.507 回答