如何使用 Cron 在固定时间运行 shell 脚本?

如何使用 Cron 在固定时间运行 shell 脚本?

我想学习 cron,所以我搜索了一些高质量的教程。我发现如何设置 cron 任务

我的目标是在网络上创建一个包含子文件夹的文件夹。每个子文件夹都是一个由 cron 执行的特定脚本。我不想让我们的系统超载,那么如何创建 cron 并在指定时间和运行上一个脚本后运行 shell 脚本?

例子:

Main Folder
    Sub1 - script1
    Sub2 - script2
    Sub3 - script3

Cron 10:01 - runs script1
Cron 10:02 - runs script2
Cron 10:03 - runs script3
Cron 10:04 - runs script1
Cron 10:05 - runs script2

答案1

创意提纲

你的朋友是一位老派的cron伙伴at

at 和 batch 使用 /bin/sh 从标准输入或指定文件读取稍后执行的命令

将其与 结合起来run-parts

run-parts——在目录中运行脚本或程序

这个想法是,你编写一个 cron 作业,使用 启动“子文件夹”中的脚本run-parts

如果您想要根据系统负载并行执行,则可以使用 包装每个单独脚本的执行batch

例子

在我的安装中我使用自己的包装脚本batchme。这为邮寄报告和输出提供了一些增强功能。

cron.{daily,weekly,monthly} 脚本在我的 crontab 中以如下方式包装:

@midnight   root  test -x /usr/sbin/anacron ||  for script in $( run-parts --list  /etc/cron.daily)  ; do batchme --quiet --info "cron-daily ${script}" ${script} ; done

@weekly   root  test -x /usr/sbin/anacron ||  for script in $( run-parts --list  /etc/cron.weekly) ; do batchme --quiet --info "cron-weekly ${script}" ${script} ; done

@monthly        root  test -x /usr/sbin/anacron ||  for script in $( run-parts --list  /etc/cron.monthly); do batchme --quiet --info "cron-monthly ${script}" ${script} ; done

答案2

编写第 4 个脚本,按顺序调用前 3 个脚本。

 #! /bin/sh
/path/to/script1
/path/to/script2
/path/to/script3

然后从 cron 调用第 4 个脚本。cron 最常见的问题是它使用最小 shell 运行,因此请使用完整路径调用所有脚本(包括第 4 个脚本)。

如果您遇到此问题,请发布您的 cron 条目以及有关所遇到的问题的更多详细信息。

答案3

我不会每隔一分钟左右通过 cron 调用一个新脚本,而是会调用一个脚本并将所有代码放入该脚本中。然后使用睡觉命令(假设您使用 bash 编写脚本,如果不是,则使用与该脚本语言等效的命令),在执行脚本的下一部分之前等待特定的时间间隔。这将确保脚本之间的时间,并且它们仅在另一个脚本成功完成后才运行。

例如:

克罗恩(每 15 分钟运行一次脚本)

*/15 * * * * /路径/到/脚本

脚本

 #!/bin/bash
 if command
       then
                   command executed successfully
                   sleep 120

       else
                   command failed so
                   execute all commands up to fi
       fi

注意睡眠 120它告诉 bash 等待 2 分钟或 120 秒再执行下一行。

相关内容