У меня базовая система 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
команда. Объединение большего количества команд вместе с ;
или &&
дает старую ситуацию, когда я не могу прервать цикл.
Что мне делать?
Добавьте условие уничтожения:
canary=$(mktemp)
echo "Canary is $canary"
while [[ -f "$canary" ]]; do
COMMAND
sleep 15
done &
Чтобы вырваться, убейте ( rm
) канарейку.
Думали ли вы об использовании ловушки?
#! /bin/sh
trap "break" INT
while :
do
COMMAND && sleep 15
done
Утилита 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
}