Прервать бесконечный цикл while в FreeBSD

У меня базовая система FreeBSD только с терминалом. Я хотел бы отслеживать статус zpool каждые 15 секунд или около того. Обычно в «обычных» системах я бы использовал watch -n15 , но здесь это недоступно.

Я не знаю, хочу ли я приступить к установке новых программ на важном и, возможно, уязвимом хосте. Но я готов сделать это, если это действительно просто. Я слышал о замене под названием cmdwatch .

Мое простое решение для мониторинга программы - использовать цикл while, а именно:

while :; do zpool status && sleep 15; done

Это мнимое работает. Однако теперь я не могу разорвать цикл с помощью Ctrl + C, что является большой неприятностью. Я могу использовать Ctrl + Z, чтобы поместить цикл в фоновый режим, вызвать ps , чтобы получить PID, а затем kill -9 программу. Обычное убийство не работает.

Так что этого недостаточно. Для любого пользователя, кроме меня, система выглядит сломанной. В другом сообщении я рекомендовал проверить, что код возврата больше 128, SIGINT должен дать 130, вот так

while [ 1 ]; do zpool status; test $? -gt 128 && break; done

Это работает, если я запускаю только sleep 15 команда. Объединение большего количества команд вместе с ; или && дает старую ситуацию, когда я не могу прервать цикл.

Что мне делать?

0
09.02.2017, 00:17
3 ответа

Добавьте условие уничтожения:

canary=$(mktemp)
echo "Canary is $canary"
while [[ -f "$canary" ]]; do
    COMMAND
    sleep 15
done &

Чтобы вырваться, убейте ( rm ) канарейку.

1
28.01.2020, 02:46

Думали ли вы об использовании ловушки?

#! /bin/sh
trap "break" INT
while :
do
    COMMAND && sleep 15
done
0
28.01.2020, 02:46

Утилита GNU watch доступна для FreeBSD как the gnu-watch порт / пакет .

После помещения цикла в фоновый режим просто fg и нажмите Ctrl + C .

bash-4.4$  while true; do echo hello && sleep 2; done &
[1] 26130
bash-4.4$ hello
hello
hello
hello
hello
hello

bash-4.4$ fg
while true; do
    echo hello && sleep 2;
done
hello
^C
bash-4.4$

Очень простая реализация утилиты watch со статическим временем ожидания 5 секунд в качестве функции оболочки:

function watch
{
    while true; do 
        clear
        command "$@"
        sleep 5
    done
}
0
28.01.2020, 02:46

Теги

Похожие вопросы