종료 할 때마다 자동으로 다시 실행하려는 명령이 있으므로 다음과 같이 실행했습니다.
while [ 1 ]; do COMMAND; done;
하지만 루프를 멈출 수 없다면 전체 루프 Ctrl-c가 아니라 죽 COMMAND
입니다.
어떻게 비슷한 것을 얻을 수 있지만 터미널을 닫지 않고 멈출 수 있습니까?
종료 할 때마다 자동으로 다시 실행하려는 명령이 있으므로 다음과 같이 실행했습니다.
while [ 1 ]; do COMMAND; done;
하지만 루프를 멈출 수 없다면 전체 루프 Ctrl-c가 아니라 죽 COMMAND
입니다.
어떻게 비슷한 것을 얻을 수 있지만 터미널을 닫지 않고 멈출 수 있습니까?
답변:
명령의 종료 상태를 확인하십시오. 신호에 의해 명령이 종료 된 경우 종료 코드는 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
paplay alert.ogg
하기 때문에 COMMAND = 작동하지 paplay
않습니까?
ctrl+를 사용하여 작업을 실행하는 동안 백그라운드에서 작업을 중지하고 넣을 수 있습니다 z. 그런 다음 다음을 사용하여 작업을 종료 할 수 있습니다.
$ kill %1
여기서 [1]은 작업 번호입니다.
무한 루프를 스크립트에 넣고 신호를 처리하는 것이 가장 좋습니다. 기본 시작점 은 다음과 같습니다 . 꼭 맞게 수정하고 싶을 것입니다. 스크립트는 - (또는 ) trap
를 잡기 위해 사용 하고 명령을 종료하고 ( 여기서는 테스트로 사용 했습니다) 종료합니다.ctrlcSIGTERM
sleep
cleanup ()
{
kill -s SIGTERM $!
exit 0
}
trap cleanup SIGINT SIGTERM
while [ 1 ]
do
sleep 60 &
wait $!
done
trap "exit 0" SIGINT SIGTERM; while true; do netcat -l -p 3000; done
나는 일반적으로 그냥 잡고 있습니다 Ctrl-C. 조만간 사이에 등록되어 루프 COMMAND
를 종료합니다 while
. 아마도 더 좋은 방법이있을 것입니다.
paplay
1s 파일 과 같은 특정 명령에는 실패 합니다.
왜 간단하지 않습니까?
while [ 1 ]; do COMMAND || break; done;
또는 스크립트에서 사용될 때
#!/bin/bash
while [ 1 ]; do
# ctrl+c terminates COMMAND and exits the while loop
# (assuming COMMAND responds to ctrl+c)
COMMAND || break
done;
while :
무한 루프를 만들고 [ 1 ]
while :; do COMMAND; done &
PID가 인쇄됩니다. 를 사용하여 프롬프트를 종료 ctrl+d
하면 백그라운드 작업이 종료되지 않으며 나중에 다음을 사용하여 작업을 종료 할 수 있습니다kill PID
PID를 잃어버린 경우 pstree -pa $USER
또는 PID pgrep -fl '.*PROCESS.*'
를 찾도록 도와 줄 수 있습니다.