В 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

Но если есть несколько cron, я не уверен, как к этому подойти:

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

Любое руководство с этим будет высоко оценено, спасибо.


person Brenton    schedule 07.10.2020    source источник


Ответы (1)


синтаксический анализ crontabs, чтобы выяснить, должно ли задание выполняться, кажется мне в корне неверным. что, если есть другой crontab с тем же набором скриптов? что, если скрипты запускались вручную? что, если вы переключите cron-логику на 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 на systemd.unit (очевидно, только если вам подходит systemd), что позволяет указать время, порядок выполнения и зависимости между его частями .

person umläute    schedule 07.10.2020
comment
Это из записей cron OpenWrt, созданных надстройкой luci-app-wifischedule. Я понимаю вашу точку зрения о cron, поэтому я мог бы также grep/awk использовать те же данные из конфигурационного файла luci-app-wifischedule, но это будет единственная функция cron на устройстве. Система настроена на загрузку с отключенным Wi-Fi, поэтому я хочу, чтобы скрипт проверял, не пропустил ли он запланированное время запуска. Я не хочу изменять сценарий luci-app-wifischedule. Спасибо за участие :) - person Brenton; 07.10.2020
comment
@Brenton Я мало что знаю об этом, но README в конце страницы, на которую вы ссылаетесь, перечисляет то, что может упростить вам задачу: /usr/bin/wifi_schedule.sh recheck - person MemReflect; 08.10.2020
comment
Спасибо, @MemReflect хорошо замечен, но нет, он только проверяет, есть ли связанные станции, он не будет stop беспроводной, если вы не используете команду forecestop - person Brenton; 09.10.2020