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

发布于 2024-07-19 09:09:02 字数 373 浏览 10 评论 0原文

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

可能的解决方案:

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

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

When running a script with cron, any executable called inside must have the full path. I discovered this trying to run wondershaper, when many errors showed when it tried to call tc. So my question is, what's the proper way to overcome this problem?

Possible solutions:

  • cd to the executable folder and prepare symbolic links to any other called executable there (not sure if it works - low portability)
  • use full paths in the script (it works - low portability across different distros)
  • exporting a path variable with the needed paths inside the script (not sure if it works)

Well, thanks in advance for anyone helping.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

弥枳 2024-07-26 09:09:02

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

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

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

请注意,我的 .profile 加载 .bash_profile 和 <代码>.bashrc。 只要确保您获取的任何文件都有您需要的内容即可。

If you're on linux/bsd/mac you can set some environment variables like PATH right in the crontab, and with that you're generally good to go.

If you're on Solaris, well, I pray for you. But, I do have an answer too: I generally source .profile before running anything:

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

Mind you, my .profile loads .bash_profile and .bashrc. Just be sure whatever file you source has what you need.

羁客 2024-07-26 09:09:02

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

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

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

Declaring variables inside your cron job is more explicit and easier to maintain : all you have to modify is contained in your cron job, and you don't need to transfer multiple files should you move it to another system.

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

*/2 * * * * myappinpath
*/3 * * * * $MYAPPROOT/mylocalapp
平生欢 2024-07-26 09:09:02

由于 cron 不运行登录,因此不会获取 .profile 和 /etc/profile。 因此 PATH 可能未设置为您期望的值。 我可以

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

您的符号链接技巧假设。 在 PATH 中,但看起来不太好

Since cron does not run login, .profile and /etc/profile are not sourced. Therefore PATH may not be set to a value you expect. I would either

  • set and export PATH to an appropriate value
  • use full paths in the script

Your trick with symlinks assumes . is in the PATH and just does not seem nice

你与清晨阳光 2024-07-26 09:09:02

我的建议:

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

问候

My recomendation:

Set all variables in a external file. I use 'process_name.env' file located in /etc/process_name or similar. Imagine you have a backup script. Then you:

  • Create /etc/backup.env and put all environment variables needed for do the "backup" task.
  • Modify your backup script and add this line after Shebang:

    . /etc/backup.env #There is a dot and a space before full path to backup environment.

IMO this approach is better than declaring variables at CRON definitions because:

  • Easy to maintain. Just edit a file.
  • Easy to switch configuration/centralized configuration:
    • You can have multiple .env for using your script in different situations (for example, consider you have backup locations on your .env, you can pass .env location as an argument and run your cron job daily providing an .env with few locations and weekly with different locations by providing another .env, just a example).
  • You can keep your .env files in a VCS like SVN or Git.
  • Much easy to test your scripts (there is no need to execute it from CRON).

Regards

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文