使用cron运行脚本的正确方法?

时间:2009-05-04 12:47:41

标签: linux bash scripting cron sysadmin

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

可能的解决方案:

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

好的,先谢谢任何人的帮助。

4 个答案:

答案 0 :(得分:4)

如果您使用的是linux / bsd / mac,则可以在PATH中设置一些环境变量,例如crontab,并且通常情况下您可以使用它。

如果你在Solaris上,那么,我为你祈祷。但是,我也有答案:我通常会在运行任何内容之前找到.profile

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

请注意,我的.profile加载.bash_profile.bashrc。请确保您提供的文件符合您的要求。

答案 1 :(得分:3)

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

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

使用符号链接的技巧假定。是在PATH中,似乎并不好看

答案 2 :(得分:3)

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

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

*/2 * * * * myappinpath
*/3 * * * * $MYAPPROOT/mylocalapp

答案 3 :(得分: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执行它)。

此致