Bash выполняет цикл for, когда время находится вне рабочих часов - PullRequest
1 голос
/ 19 марта 2019

Я пытаюсь сделать приведенный ниже скрипт для выполнения двоичного файла восстановления между часами 17:00 - 07:00 для каждой папки, имя которой начинается с EAR_ * в / backup_local / ARCHIVES /, но по какой-то причине он не работает должным образомЭто означает, что цикл for не прерывается, если условие времени становится недействительным.

Должен ли я добавить цикл while внутри цикла for?

#! /usr/bin/bash
#set -x



while :; do
 currenttime=$(date +%H:%M)
 if [[ "$currenttime" > "17:00" ]] || [[ "$currenttime" < "07:00" ]]; then
 for path in /backup_local/ARCHIVES/EAR_*; do
     [ -d "${path}" ] || continue # if not a directory, skip
     dirname="$(basename "${path}")"
     nohup /Restore -a /backup_local/ARCHIVES -c -I 0 -force -v > /backup_local/$dirname.txt &
     wait $!
     if [ $? -eq 0 ]; then
         rm -rf $path
         rm /backup_local/$dirname.txt
         echo $dirname >> /backup_local/completed.txt
     fi
 done &
else
  echo "Restore can be ran only outside working hours!"
  break
fi
done &

Ответы [ 2 ]

0 голосов
/ 19 марта 2019

ваш скрипт выглядит следующим образом в псевдокоде:

START
IF outside workinghours
    EXIT
ELSE
    RUN /Restore FOR EACH backupdir
GOTO START

Сценарий проверяет время только один раз, прежде чем запустить restore прогон (который будет вызывать /Restore для каждого каталога для восстановления вцикл for) Он продолжит запуск цикла for, пока не начнется рабочее время.Затем он выйдет.

Например, если вам нужно восстановить 3 папки для восстановления, каждая занимает 2 часа;и вы запускаете сценарий в полночь;затем скрипт проверит, не в нерабочее ли время (оно есть), и начнет восстановление для первой папки (на 0:00), после двух часов работы он начнет восстановление 2-й папки (на 2:00)еще через два часа начнется восстановление 3-й папки (на 4:00).Как только третья папка будет восстановлена, она снова проверит рабочее время.Так как теперь это только 6:00, то есть: вне рабочих часов, он начнет восстановление для первой папки (на 6:00), после двух часов работы он начнет восстановление второй папки (на 8:00).), еще через два часа начнется восстановление 3-й папки (на 10:00).Это полдень, когда он делает следующую проверку рабочего времени;поскольку 12:00 находится в пределах 7:00 .. 17:00, сценарий теперь остановится.С сообщением об ошибке.

Возможно, вы захотите, чтобы восстановление запускалось только один раз для каждой папки, и остановите переход к следующей папке, если начнется рабочее время.

#!/bin/bash
for path in /backup_local/ARCHIVES/EAR_*/; do
  currenttime=$(date +%H:%M)
  if [[ "$currenttime" > "7:00" ]] && [[ "$currenttime" < "17:00" ]]; then
      echo "Not restoring inside working hours!" 1>&2
      break
  fi
  dirname="$(basename "${path}")"
  /Restore -a /backup_local/ARCHIVES -c -I 0 -force -v > /backup_local/$dirname.txt
  # handle exit code
done

update

Я только что заметил ваше либеральное распространение & для фоновой работы.Предположительно это позволяет запускать скрипт из удаленной оболочки. не

Что это действительно будет делать:

  1. он будет выполнять все итерации по каталогам восстановления параллельно.Это может создать узкое место в вашем хранилище (если каталоги для восстановления на / с совместно используют одно и то же оборудование)
  2. , это заменит весь цикл восстановления и немедленно вернется к проверке в нерабочее время.если проверка прошла успешно, она создаст другой цикл для восстановления (и фоновый режим).затем он вернется к проверке в нерабочее время и вызовет другой фоновый цикл для восстановления.До рассвета у вас, вероятно, есть несколько тысяч фоновых потоков для восстановления каталогов.Скорее всего, вы превысили свои ресурсы и процесс был убит.

В приведенном выше примере сценария пропущен весь фон (и nohup).

, если вы хотите запуститьскрипт из удаленной оболочки (и выход из оболочки после его запуска), просто запустите его с

nohup restore-script.sh &

В качестве альтернативы вы можете использовать

echo "restore-script.sh" | at now

или использовать cron-job (еслиприменимо)

0 голосов
/ 19 марта 2019

Шебанг содержит нежелательное пространство. На моем Ubuntu bash находится в /bin/bash.

Ваш, находится там:

type bash

В моем тесте разрывается цикл while, замените путь #!/bin/bash на результат предыдущей команды:

#!/bin/bash --
#set -x

while : ; do
 currenttime=$(date +%H:%M)
 if [[ "$currenttime" > "17:00" ]] || [[ "$currenttime" < "07:00" ]]; then
   for path in /backup_local/ARCHIVES/EAR_*; do
     [ -d "${path}" ] || continue # if not a directory, skip
     dirname="$(basename "${path}")"
     nohup /Restore -a /backup_local/ARCHIVES -c -I 0 -force -v > /backup_local/$dirname.txt &
     wait $!
     if [ $? -eq 0 ]; then
         rm -rf $path
         rm /backup_local/$dirname.txt
         echo $dirname >> /backup_local/completed.txt
     fi
   done &
 else
   echo "Restore can be ran only outside working hours!"
   break
 fi
done &
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...