종료될 때마다 자동으로 다시 실행하고 싶은 명령이 있어서 다음과 같은 명령을 실행했습니다.
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
을 포착하고 명령을 종료하고( 여기에서는 테스트로 사용하고 있습니다) 종료됩니다.ctrlcSIGTERM
sleep
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