#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. Отредактировано с объяснением и альтернативной версией.