무한 루프 종료

무한 루프 종료

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

while [ 1 ]; do COMMAND; done;

그러나 as를 사용하여 루프를 중지할 수 없다면 전체 루프가 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를 사용하여 명령을 중단하는 경우 SIGINT는 Unix 시스템에서 신호 2이므로 종료 코드는 130이 됩니다. 그래서:

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

관련 정보