Cron 表达式符号

Cron 表达式符号

我想编写一个 crontab 条目,在每个月的最后一周每 30 分钟运行一次。我知道要在最后一个星期日执行,例如 cron 是:

0 0/30 * ? * 0L

当我尝试用逗号分隔星期几字段时,如下所示:

0 0/30 * ? * 0L,1L,2L,3L,4L,5L,6L 

我收到一个错误:

Support for specifying 'L' with other days of the week is not implemented

有没有办法简化这个 crontab 表达式,或者我是否需要创建 7 个单独的 crontab 条目,每个条目代表不同的日期?

答案1

错误消息表明您无法执行此操作。您必须让脚本检查今天是否在本月的最后一周内,然后按要求退出/继续。

#!/bin/bash

MonthDays=$(echo $(cal) | awk '{print $NF}')
Today=$(date '+%d')
let DaysLeft=MonthDays-Today

if [ $DaysLeft  -gt  6 ]
then
    exit 1
fi
echo "Run the rest of the script"

或者,您可以在 crontab 中使用以下脚本 - 将其另存为last-week

#!/bin/bash

MonthDays=$(echo $(cal) | awk '{print $NF}')
Today=$(date '+%d')
let DaysLeft=MonthDays-Today

if [ $DaysLeft  -gt  6 ]
then
    exit 1
fi

像这样使用

0,30 * * * * last-week && your-script

your-script如果last-week脚本以 0 状态退出则运行。

答案2

如果您想要真正的“上周”(从每月的最后一个星期日到剩下的时间),请对@Iain 的脚本进行一些更改:

#!/bin/bash

Today=$(date +%d)
LastSun=$(ncal | awk 'NR==2 { print $NF }')

if [ $Today -ge $LastSun ]
then
    exit 1
fi

以同样的方式使用它。

相关内容