Как выполнять цикл для каждого часа в BASH?

#bash

#bash

Вопрос:

Я настроил задание cron, в котором за один шаг необходимо выполнить команду, на выполнение которой потребуется 10-14 часов времени. Если он будет успешно завершен, мы получим эту «сборку цели: ПЕРЕДАЧА» в main.txt досье. Как мне нужно проверить «сборку цели: ПЕРЕДАЧА» в main.txt файл за каждый час ?

 if grep -q "Build of target : PASS" main.txt; then
echo "Passed"
else
echo "failed"
fi
  

Я застрял на том, как проверять / grep слово to на каждый час.

Комментарии:

1. Настройка другого cronjob?

2. @DanielW., Я хочу сказать, что в одном задании на обрезку я добавил много команд и кода, Если я создам какое-либо задание cron, клиенту будет трудно понять. Вот почему я не могу создать другое задание cron

3. @Akhil, cron может просто запустить ваш скрипт в точке входа. Почему это трудно понять читателю? Скрипт не нужно встраивать в crontab, достаточно команды, которая его запускает.

4. Предоставленный скрипт будет делать то, что вы хотите. Вы спрашиваете, как сделать так, чтобы это выполнялось один раз в час, или как получить вывод из него, если вы его запускаете cron ?

5. … тем не менее, если вы хотите отслеживать файл, пока он не будет закрыт , есть лучшие инструменты. Я бы вообще не делал никаких периодических grep операций, а вместо этого делал бы либо непрерывный хвост, либо использовал inotifywait бы для получения уведомлений всякий раз, когда все, что записывается в файл, завершено и закрывает его. grep перечитывает файл с самого начала; по своей сути неэффективно запускать снова и снова, когда вам нужно только проверять недавно добавленные строки.

Ответ №1:

Запустите ежечасное задание cron с кодом для выполнения проверки.

 17 * * * * grep -q "Build of target : PASS" main.txt amp;amp; fuser -k main.txt
  

fuser -k это просто простой способ убить того, кто пишет main.txt в Linux; если вы знаете PID или находитесь на другой платформе, будут и другие способы выяснить, какой именно процесс нужно убить.

Ответ №2:

Может быть, что-то вроде

 res=failes
for h in 1 2 3 4 5 6 7 8 9 10 11 12 13 14
do  if grep -q "Build of target : PASS" main.txt
    then res="Passed"
         break
    else sleep 3600
    fi
do
if [[ Passed != "$res" ]] amp;amp; grep -q "Build of target : PASS" main.txt
then res="Passed"
fi
echo "$res"
  

Если процесс выполняется в течение полных 14 часов и успешно завершается только ближе к концу, то в начале 14-го часа grep он не найдет ПРОХОД и перейдет в спящий режим, но в конце часа цикл for не войдет в 15-ю итерацию, чтобы протестировать его снова. Это проверяет наличие успехов в последнюю минуту, но сначала проверяет строку, чтобы она не понадобилась grep снова, если уже найдена.

Вероятно, лучшим способом было бы перевернуть эту логику, поскольку вряд ли это удалось бы уже в начале первого часа —

 res=failed
for h in 1 2 3 4 5 6 7 8 9 10 11 12 13 14
do  sleep 3600
    if grep -q "Build of target : PASS" main.txt
    then res="Passed"
         break
    fi
done
echo "$res"
  

Но имейте в виду, что это гарантирует ожидание в течение первого часа, прежде чем он даже проверит.

Комментарии:

1. могу ли я узнать, почему во второй раз вы написали цикл if. С помощью цикла for мы можем выполнять прямо в течение 14 часов с интервалом в 1 час?

2. Отредактировано с объяснением и альтернативной версией.