FreeBSD에서 무한 "while" 루프 깨기

FreeBSD에서 무한 "while" 루프 깨기

FreeBSD베어본 터미널 전용 시스템이 있습니다 . 나는 zpool status이것을 15초마다 모니터링 하고 싶습니다 . 일반적으로 "일반" 시스템에서는 사용 watch -n15하지만 여기서는 사용할 수 없습니다.

중요하고 잠재적으로 취약한 호스트에 새 프로그램을 설치하고 싶은지 모르겠습니다. 하지만 그것이 정말 간단하고 기꺼이 할 의향이 있다면 이라는 대안을 들어본 적이 있습니다 cmdwatch.

내 모니터링 프로그램에 대한 간단한 솔루션은 while 루프를 사용하는 것입니다. 즉:

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

이것은 표면적으로 작용합니다. 그러나 이제는 Ctrl + C를 사용하여 루프를 중단할 수 없으므로 이는 큰 번거로움입니다. Ctrl+Z를 사용하여 백그라운드에 루프를 배치하고 호출하여 psPID를 가져온 다음 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$

watch5초의 정적 절전 시간을 갖는 쉘 함수로 이 유틸리티를 매우 간단하게 구현합니다 .

function watch
{
    while true; do 
        clear
        command "$@"
        sleep 5
    done
}

답변3

트랩 사용을 고려해 본 적이 있습니까?

#! /bin/sh
trap "break" INT
while :
do
    COMMAND && sleep 15
done

관련 정보