FreeBSD
베어본 터미널 전용 시스템이 있습니다 . 나는 zpool status
이것을 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
. 더 많은 명령을 ;
함께 연결 하거나 &&
루프를 끊을 수 없는 오래된 상황을 만듭니다.
나는 무엇을 해야 합니까?
답변1
종료 조건 추가:
canary=$(mktemp)
echo "Canary is $canary"
while [[ -f "$canary" ]]; do
COMMAND
sleep 15
done &
탈출하려면 rm
카나리아를 죽이세요( ).
답변2
GNU watch
유틸리티예FreeBSD의 경우 다음과 같이 사용 가능포트 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
}
답변3
트랩 사용을 고려해 본 적이 있습니까?
#! /bin/sh
trap "break" INT
while :
do
COMMAND && sleep 15
done