首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在bash/ash中,如何构造检查cron的逻辑?

问在bash/ash中,如何构造检查cron的逻辑?
EN

Stack Overflow用户
提问于 2020-10-07 14:30:57
回答 1查看 72关注 0票数 0

我正在尝试创建一个脚本来比较cron,如果当前日期/时间在cron启动/停止时间内,则执行一个函数。如果只有一个cron条目用于start/stop,这将很简单,但是我不知道如何允许多个cron。我使用的是posix/ash,但如果有人能提供一个bash示例,希望我能改编它。我只是被困在理解如何构建逻辑上了?

例如:如果cron是这样的话,它将是一个简单的if语句:

代码语言:javascript
复制
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

但是如果有多个cron,我不确定如何处理:

代码语言:javascript
复制
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,但这似乎只在第一次匹配时起作用,否则就会进入循环。

我尝试做的是调用start wireless函数,如果它与cron匹配。例如,如果设备在cron开始时间之后和cron停止时间之前启动,则启动无线,或者如果它在cron停止之后启动,则停止无线。到目前为止,我尝试过的一些方法是:

获取最新的$day和$hour

代码语言:javascript
复制
day=$(date +%a) & hour=$(date +%H)

获取$day的cron $start和$stop时间

代码语言:javascript
复制
start=$(grep $day /etc/crontabs/root | awk '/start/ {print $2}')
stop=$(grep $day /etc/crontabs/root | awk '/stop/ {print $2}')

统计发生的启动/停止次数(如$count=3)

代码语言:javascript
复制
count=$(echo "$start" | wc -l)

创建用于启动/停止的变量

代码语言:javascript
复制
set -- $start
set -- $stop

从$count=3确定变量(例如-- $3,$2,$1)

代码语言:javascript
复制
var=$(eval echo \$$count)

我使用while的失败示例

代码语言:javascript
复制
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

任何关于这方面的指导都将不胜感激,谢谢。

EN

回答 1

Stack Overflow用户

发布于 2020-10-07 15:00:09

在我看来,解析crontab以确定作业是否应该运行是根本错误的。如果有另一个crontab运行相同的脚本集怎么办?如果脚本是手动运行的,该怎么办?如果将cron-logic切换到systemd.timers会怎么样

看起来你真正想做的是检查系统是否处于给定的状态(例如"WiFi已打开“,甚至"WiFi应已打开”)。

因此,您真正应该做的是尝试找出系统是否处于请求的状态。

它可以像在cron执行的脚本中设置一个标志一样简单。

例如,您的wifi_schedule.sh脚本(您确实应该将其放入/usr/local/bin/中,因为/usr/bin是为系统保留的):

代码语言:javascript
复制
#!/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切换到systemd.unit (显然,只有在您可以接受systemd的情况下),它允许您表达时间、执行顺序和各个部分之间的依赖关系。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64238411

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档