bash - 在 bash/ash 中如何构造检查 cron 的逻辑?
问题描述
我正在尝试创建一个脚本来比较 cron,如果当前日期/时间在 cron 开始/停止时间之内,则执行一个函数。如果启动/停止只有一个 cron 条目,这将很简单,但我不知道如何允许多个 cron。我正在使用 posix/ash 但如果有人可以提供一个 bash 示例,希望我能适应它。我只是不明白如何构建逻辑?
例如:如果 cron 是这样的,那将是一个简单的if
语句:
00 09 * * Mon,Tue,Wed,Thu,Fri,Sat,Sun /usr/bin/wifi_schedule.sh start
00 11 * * Mon,Tue,Wed,Thu,Fri,Sat,Sun /usr/bin/wifi_schedule.sh stop
但如果有多个 crons,我不知道如何处理这个问题:
00 09 * * Mon,Tue,Wed,Thu,Fri,Sat,Sun /usr/bin/wifi_schedule.sh start
00 11 * * Mon,Tue,Wed,Thu,Fri,Sat,Sun /usr/bin/wifi_schedule.sh stop
00 15 * * Mon,Tue,Wed,Thu,Fri,Sat,Sun /usr/bin/wifi_schedule.sh start
00 17 * * Mon,Tue,Wed,Thu,Fri,Sat,Sun /usr/bin/wifi_schedule.sh stop
00 19 * * Mon,Tue,Wed,Thu,Fri,Sat,Sun /usr/bin/wifi_schedule.sh start
00 21 * * Mon,Tue,Wed,Thu,Fri,Sat,Sun /usr/bin/wifi_schedule.sh stop
我尝试过使用while
,但这似乎只对第一个匹配项起作用或进入循环。
如果它与 cron 匹配,我正在尝试做的是调用启动无线功能。例如,如果设备在 cron 启动时间之后和 cron 停止时间之前启动,则启动无线,或者如果它在 cron 停止之后启动,则停止无线。到目前为止我尝试过的一些事情是:
获取当前$day
和$hour
day=$(date +%a) & hour=$(date +%H)
获取 cron$start
和$stop
时间$day
start=$(grep $day /etc/crontabs/root | awk '/start/ {print $2}')
stop=$(grep $day /etc/crontabs/root | awk '/stop/ {print $2}')
计算发生了多少次开始/停止时间(例如$count=3
)
count=$(echo "$start" | wc -l)
为启动/停止创建变量
set -- $start
set -- $stop
确定变量$count=3
(例如 -- $3
, $2
, $1
)
var=$(eval echo \$$count)
我失败的使用示例while
:
while [ $var -le $hour ];
do
if [ $hour -ge $var ]; then
echo "do something"
else
var=$(eval echo \$$count)
count=$(( $count - 1 ))
echo "do something else"
fi
done
exit
任何有关这方面的指导将不胜感激,谢谢。
解决方案
解析 crontabs 以查明是否应该运行作业在我看来根本是错误的。如果有另一个crontab 运行相同的脚本集怎么办?如果脚本是手动运行的呢?如果您将 cron-logic 切换到systemd.timers
怎么办?
看来您真正想要做的是检查系统是否处于给定状态(例如“WiFi 已打开”甚至“WiFi 应打开”)。
所以你真正应该做的是尝试找出系统是否处于请求状态。
它可以像在 cron 执行的脚本中设置一个标志一样简单。
例如你的wifi_schedule.sh
脚本(你真的应该把它放进去/usr/local/bin/
,因为/usr/bin
它是为系统保留的):
#!/bin/sh
case "$1" in
start)
echo 1 > /var/run/wifi_schedule
;;
stop)
echo 0 > /var/run/wifi_schedule
;;
esac
# here comes the actual script:
# ...
如果手头的实际任务更复杂,您可以考虑从cron
to切换systemd.unit
(显然只有在您可以接受 systemd 的情况下),它允许您表达时序、执行顺序和各部分之间的依赖关系。
推荐阅读
- python - 通过 Selenium 和 Python 调用 webdriver.Remote("http://localhost:4444/wd/hub", webdriver.DesiredCapabilities.CHROME) 时出现 WebDriverException
- java - 这个递归代码如何改变我的列表?
- c# - c#如何知道哪个方法是构造函数
- pulseaudio - 切勿在 PulseAudio 中使用特定接收器
- ansible - Ansible playbook 使用带有来自 stdout 的变量的 date.stdout 过滤器
- mysql - 如何查询价格和数量组合小于另一个的产品
- java - 如何找出在itext7中设置换行符(连字符)的位置
- node.js - 如何在 Node.js 中使用 cli-chart 添加条形级别标签?
- javascript - 如何根据 post http 方法响应状态设置状态?
- python - pytest 测试参数化覆盖