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

Posted

技术标签:

【中文标题】使用 cron 运行脚本的正确方法?【英文标题】:Proper way to run a script using cron? 【发布时间】:2010-10-23 15:02:02 【问题描述】:

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

可能的解决方案:

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

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

【问题讨论】:

这里的“grub”是引导加载程序吗? 大声笑,我的意思是 cron 一路:$ 啊...这更有意义。 对不起,我只是在写问题时解决了一些 grub 问题,看起来我的大脑搞混了 【参考方案1】:

如果您使用的是 linux/bsd/mac,您可以在 crontab 中设置一些环境变量,例如 PATH,这样您就可以开始使用了。

如果您使用的是 Solaris,那么,我为您祈祷。但是,我也有一个答案:我通常会在运行任何东西之前获取.profile

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

请注意,我的 .profile 加载了 .bash_profile.bashrc。只需确保您来源的任何文件都有您需要的内容。

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

简单评论一下:0-59/2 和 */2 不一样吗?【参考方案3】:

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

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

您使用符号链接的技巧假定 .位于 PATH 中,但看起来不太好

【讨论】:

【参考方案4】:

我的建议:

在外部文件中设置所有变量。我使用位于 /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 执行)。

问候

【讨论】:

以上是关于使用 cron 运行脚本的正确方法?的主要内容,如果未能解决你的问题,请参考以下文章

Bash 脚本未在 Cron 中正确执行

如何使用 rbenv 和 cron 运行 Ruby 脚本

根 crontab 无法正确运行,用户 cron 作业可以

每天美国东部标准时间下午 5 点运行 cron 脚本 [重复]

你怎么得到运行Node.js脚本的cron作业从.env文件中读取变量?

每天在美国东部标准时间下午5点运行cron脚本[重复]