무한 루프 종료

무한 루프 종료

종료될 때마다 자동으로 다시 실행하고 싶은 명령이 있으므로 다음과 같이 실행했습니다.

while [ 1 ]; do COMMAND; done;

그러나 루프를 중지할 수 없으면 전체 루프가 아니라 Ctrl-c종료됩니다 .COMMAND

비슷한 것을 달성하려면 어떻게 해야 합니까? 터미널을 닫지 않고도 중지할 수 있습니까?

답변1

ctrl+ 를 사용하여 작업이 실행되는 동안 작업을 중지하고 백그라운드에 둘 수 있습니다 z. 그런 다음 다음을 사용하여 작업을 종료할 수 있습니다.

$ kill %1

여기서 [1]은 귀하의 직업 번호입니다.

답변2

명령의 종료 상태를 확인하십시오. 명령이 신호에 의해 종료된 경우 종료 코드는 128 + 신호 번호가 됩니다. 로부터Bash용 GNU 온라인 문서:

셸의 목적에 따라 종료 상태가 0인 상태로 종료되는 명령이 성공했습니다. 0이 아닌 종료 상태는 실패를 나타냅니다. 이렇게 반직관적으로 보이는 방식이 사용되므로 성공을 나타내는 하나의 잘 정의된 방법과 다양한 실패 모드를 나타내는 다양한 방법이 있습니다. 숫자가 N인 치명적인 신호에서 명령이 종료되면 Bash는 종료 상태로 128+N 값을 사용합니다.

POSIX는 또한 다음을 지정합니다.신호에 의해 종료되는 명령의 값은 128보다 크지만 GNU처럼 정확한 값을 지정하지 않는 것 같습니다.

신호를 수신하여 종료된 명령의 종료 상태는 128보다 큰 것으로 보고됩니다.

예를 들어 Control-C를 사용하여 명령을 중단하면 종료 코드는 130이 됩니다. 왜냐하면 Unix 시스템에서 SIGINT는 신호 2이기 때문입니다. 그래서:

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

답변3

무한 루프를 스크립트에 넣고 거기서 신호를 처리하는 것이 가장 좋을 것 같습니다. 여기기본 출발점. 나는 당신이 그것을 적합하게 수정하고 싶을 것이라고 확신합니다. 스크립트는 - (또는 ) trap을 포착 하고 명령을 종료하고( 여기서는 테스트로 사용했습니다 ) 종료됩니다.ctrlcSIGTERMsleep

cleanup ()
{
kill -s SIGTERM $!
exit 0
}

trap cleanup SIGINT SIGTERM

while [ 1 ]
do
    sleep 60 &
    wait $!
done

답변4

bash를 실행하면 -e오류 조건이 발생하면 종료됩니다.

#!/bin/bash -e
false # returns 1
echo This won't be printed

관련 정보