Crontab 增强

Crontab 增强

我的 crontab 中有 31 个 cronjobs,在前 7 个 cronjobs 完成后,我每周都会更改日期。有没有其他方法可以减少这种手动工作?

我尝试为每个 cronjob 设置具体日期。例如:15 00 1,12,22 * * ....

这是一个好的选择吗?我需要一些建议来改进我的工作。

谢谢。

编辑:我想每周轮流运行 31 次测试,每天运行 3 次。下图显示了如何为前 21 次测试设置 cronjob。

00 00 * * 1 test run 1
00 09 * * 1 test run 2
00 17 * * 1 test run 3
00 00 * * 2 test run 4
00 09 * * 2 test run 5
00 17 * * 2 test run 6
00 00 * * 3 test run 7
00 09 * * 3 test run 8
00 17 * * 3 test run 9
00 00 * * 4 test run 10
00 09 * * 4 test run 11
00 17 * * 4 test run 12
00 00 * * 5 test run 13
00 09 * * 5 test run 14
00 17 * * 5 test run 15
00 00 * * 6 test run 16
00 09 * * 6 test run 17
00 17 * * 6 test run 18
00 00 * * 7 test run 19
00 09 * * 7 test run 20
00 17 * * 7 test run 21

周日,我将安排剩余的试运行等等。

00 00 * * 1 test run 22
00 09 * * 1 test run 23
00 17 * * 1 test run 24
00 00 * * 2 test run 25
00 09 * * 2 test run 26
00 17 * * 2 test run 27
00 00 * * 3 test run 28
00 09 * * 3 test run 29
00 17 * * 3 test run 30
00 00 * * 4 test run 31
00 09 * * 4 test run 1
00 17 * * 4 test run 2
00 00 * * 5 test run 3
00 09 * * 5 test run 4
00 17 * * 5 test run 5

# (etc.)

答案1

如果您只想在特定的开始时间连续循环执行 31 个测试,只需使用脚本来跟踪下一个要运行的作业,并使用文件中的序列号。

使用单个永久 crontab 条目来指定所有时间,例如:

0 0,9,17 * * * /home/paul/JobRotate >> /home/paul/JobRotate.log 2>&1

这是一个示例脚本,用于将最新作业编号保存在 .seq 文件中,如果该文件不存在,则会创建该文件。

#! /bin/bash --
#.. This is /home/paul/JobRotate.
fn="/home/paul/JobRotate.seq"
[[ -r "${fn}" ]] && read -r Seq < "${fn}"
(( ++Seq ))
printf '%d\n' $(( Seq % 31 )) > "${fn}"
/home/paul/kJob_${Seq}

这是作业测试脚本的示例。

#! /bin/bash --
printf '%s\n' "I am kJob_17" >> /home/paul/JobRotate.log

请注意完整路径名的使用:cron 不会让您登录,因此您的配置文件(包括 PATH)不会激活。环境恶劣:这是全部cron 给了我——甚至不是我的默认登录 shell。

LANGUAGE=en_GB:en
HOME=/home/paul
LOGNAME=paul
PATH=/usr/bin:/bin
LANG=en_GB.UTF-8
SHELL=/bin/sh
PWD=/home/paul

如果您的“测试运行 x”名称不像所示的标准,您可以使用索引数组或 shell case 语句来映射它们,或者通过软链接访问有正规的名字。

答案2

根据 Paul 的评论,您可以创建包装脚本,该脚本将从 1 循环到 31。将cron变为:

0 0,9,17 * * * wrapper_script

脚本本身将会是这样的:

#!/bin/bash
a=$(cat /tmp/var_)||exit 1
b=$(( ($a)%31+1 ))
run_script $b
echo $b>/tmp/var_

不要忘记在/tmp/var_第一次使用脚本之前初始化变量

相关内容