Как выполнить команду один раз в бесконечном цикле - PullRequest
0 голосов
/ 07 марта 2019

Есть идея кода:

while true; do
*check variable*
if [ variable == true ]; then
*command1 to execute*
.
.
.
*commandN to execute*
fi
done

Как выполнить command1 только один раз, не выходя из этого цикла?Очевидно, command1 должен выполняться только один раз каждый раз, когда variable true?

EDIT: я не хочу выходить из цикла, потому что он является частьюСкрипт мониторинга для домашнего сервера Debian / устройства хранения данных.Переменная check - это проверка, включено ли VPN-соединение.Или, если в папке есть новый файл.Или, если в систему вошел новый пользователь. Триггеров может быть много.Command1 - отправить уведомление по электронной почте.Или напишите новую строку в пользовательский файл журнала.Опять же, бесчисленные приложения.Я не хочу, чтобы меня отправляли по почте каждую итерацию.Все дело в бесконечной проверке статуса и выполнении команды после изменения статуса.

Ответы [ 3 ]

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

Пример из жизни ближе: я хотел бы постоянно контролировать вывод звука.Если звуковой приемник не настроен на HDMI, я хочу видеть бесконечные напоминания на экране каждые 10 секунд, но отправлять их по почте только один раз, когда это произошло.

Итак:

while true
do
if ! pacmd -list-sinks | grep -q "active port: <hdmi-output-0>"; then AUDIO_HDMI="false"; fi

if [ "$AUDIO_HDMI" == "false" ]; then
 MSG="Audio sink is not set to HDMI!"
 notify-send $MSG
 echo "$MSG" | mail -s "WARNING" me@somwhere.com # <-PART OF CODE TO BE EXECUTED ONCE
fi

sleep 10
done

Любые идеикак отправить это письмо только один раз?

Может быть, есть другой способ найти решение, а не бесконечный цикл?

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

Мне наконец удалось сделать это с другой переменной.

while true
do
if ! pacmd -list-sinks | grep -q "active port: <hdmi-output-0>"; then AUDIO_HDMI="false"; else SEND_MAIL="reset"; fi

if [ "$AUDIO_HDMI" == "false" ]; then
 MSG="Audio sink is not set to HDMI!"
 notify-send $MSG
 if [ "$SEND_MAIL" != "sent" ]; then echo "$MSG" | mail -s "WARNING" me@somwhere.com && SEND_MAIL="sent"; fi
fi

sleep 10
done

Здесь нет элегантности, но, по крайней мере, она работает.Может ли быть другой способ достижения цели?

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

Оставьте переменную вне цикла, если вы хотите, чтобы она выполнялась только один раз -

...