我正在设置一个 cron 作业来在特定时间挂起和唤醒服务器。
我正在使用两个命令。周一至周四运行:
rtcwake -m mem -t $(date +%s -d "08:00")
另一项将于周五运行:
rtcwake -m mem -t $(date +%s -d "monday 08:00")
我想知道是否有可能使这种分离变得不必要。如果date
能够理解这样的陈述next weekday 08:00
,事情就会简化很多。
我无法找到这是否真的可行或者我应该使用什么语法。
我基本上想避免我的服务器在周六和周日醒来。
答案1
如果您愿意使用ksh93
,您可以轻松计算“下一个工作日 0800”,我认为这实际上意味着下周的第一个工作日。假设您位于美国,一周的第一个工作日通常是星期一。
$ printf "%T\n"
Tue Jan 5 16:04:37 GMT 2021
$ printf "%T\n" "0 8 * * 1"
Mon Jan 11 08:00:00 GMT 2021
$ printf "%(%s)T\n" "0 8 * * 1"
1610352000
$
上述工作原理的关键是"0 8 * * 1"
代表五个crontab
时间和日期字段的字符串。crontab(5)
有关这些字段的详细信息,请参阅联机帮助页。
没有多少人知道ksh93
时间格式化可以识别这种准 crontab 条目格式的特定部分,并以指定的格式输出相应的日期。
答案2
你可能想尝试
date +%s -d"$(( ( $(date +%w)==5 )?3:1 ))days 8:00"
编辑:回答你的评论:
date +%w
产生星期几,然后由“条件运算符”(expr?expr:expr
)计算:如果 expr1 计算结果为 TRUE,则计算并使用 expr2,否则使用 expr3。所以,星期五是第五天,date +%s -d"3days 8:00
其他日子都是跑步date +%s -d"1days 8:00
。
答案3
这是我针对类似需求提出的想法。比其他答案更详细,但它可能会让它在做什么更加明显。
last_workday() {
from_date="${@:-today}"
day_of_week=$(date +%w --date="${from_date}")
if [ ${day_of_week} = "0" ] ; then
look_back=2
elif [ ${day_of_week} = "1" ] ; then
look_back=3
else
look_back=1
fi
date -d "${from_date} - ${look_back} day" +'%Y/%m/%d'
}
next_workday() {
from_date="${@:-today}"
day_of_week=$(date +%w --date="${from_date}")
if [ ${day_of_week} = "5" ] ; then
look_forward=3
elif [ ${day_of_week} = "6" ] ; then
look_forward=2
else
look_back=1
fi
date -d "${from_date} + ${look_forward} day" +'%Y/%m/%d'
}
for i in $(seq 16); do
now=$(date +'%Y/%m/%d' --date="today + ${i} day")
prev=$(last_workday "${now}")
next=$(next_workday "${now}")
echo "${now}: ${prev} ${next}"
done