종료 할 때마다 자동으로 다시 실행하려는 명령이 있으므로 다음과 같이 실행했습니다.
while [ 1 ]; do COMMAND; done;
하지만 Ctrl-c 로 루프를 중지 할 수없는 경우 COMMAND
전체 루프가 아닙니다.
유사하지만 터미널을 닫지 않고 멈출 수있는 방법은 무엇입니까?
댓글
- ' bash에있는 경우 Ctrl-Z를 사용하여 작업을 중지 한 다음 " % 1을 종료합니다. div id = “8afb4ea65f”>
는 그것을 죽입니다.
답변
명령의 종료 상태를 확인하십시오. 명령이 신호에 의해 종료 된 경우 종료 코드는 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
댓글
- 사실 이것은 보장되지 않는다는 점을 언급해야합니다. 많은 애플리케이션에서이 작업을 수행하지 않습니다.
- @Kyle Jones :이를 언급하는 POSIX / GNU 문서에 연결할 수 있습니까?
- @cirosantilli 완료.
- @ KyleJones 감사합니다! 여전히 COMMAND =
paplay alert.ogg
에서 작동하지 않습니다. 아마도paplay
가 신호를 처리하기 때문일까요? - @cirosantilli 예, 그 '이 이유입니다. 프로세스가 신호를 처리하고 종료하면 ' 처리되지 않은 신호에 의해 종료되는 프로세스와 다릅니다.
답변
작업이 실행되는 동안 ctrl + z 를 사용하여 작업을 중지하고 백그라운드에 둘 수 있습니다. 그런 다음 다음으로 작업을 중단 할 수 있습니다.
$ kill %1
[1]은 작업 번호입니다.
댓글
- 설명 등을 보려면 이 답변 을 참조하세요.
- 이 비교적 최근 답변은 단순히 작동합니다. 찬성했습니다. +1
- 많은 도움을 주셨습니다.이 질문에서 제가 검색 한 내용입니다. 🙂
답변
무한 루프를 스크립트에 넣고 신호를 처리하는 것이 가장 좋을 것 같습니다. 여기에 “ 기본 시작점 이 있습니다. 나는 당신이 그것을 적합하게 수정하고 싶을 것이라고 확신합니다. 스크립트는 trap
를 사용하여 ctrl – c (또는 SIGTERM
)를 포착합니다. 명령을 종료하고 (여기서는 테스트로 sleep
사용했습니다) 종료합니다.
cleanup () { kill -s SIGTERM $! exit 0 } trap cleanup SIGINT SIGTERM while [ 1 ] do sleep 60 & wait $! done
댓글
- 좋아요.이 팁을 사용하여 자동 재시작 netcat 래퍼를 만든 방법은 다음과 같습니다.
trap "exit 0" SIGINT SIGTERM; while true; do netcat -l -p 3000; done
trap
접근 방식을 무한 루프가 종료되는 동일한 (bash) 스크립트에 추가하는 경우 iv id = “637ecd8079를 사용하십시오. $!
대신 “> ( 여기 참조)
Answer
일반적으로 Ctrl-C 를 누르고 있습니다. 조만간 “를 사용하여 while
루프를 종료합니다. 더 나은 방법이있을 수 있습니다.
댓글
- 이유는 확실하지 않지만 1s 파일의
paplay
와 같은 특정 COMMAND에서는 실패합니다. . - 저에게 효과적이었습니다.
- '이 모든 솔루션의 무차별 대입입니다. : /
답변
-e
로 bash를 실행하는 경우 모든 오류 조건에서 종료됩니다.
#!/bin/bash -e false # returns 1 echo This won"t be printed
댓글
- 여기의 첫 번째 줄은 지금까지입니다. 너무 많은 시간을 소비하고 싶지 않은 '
답변
단순히 아닙니다.
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;
댓글
- 매우 우아한 솔루션입니다. 하지만 ' COMMAND가 항상 성공 종료 상태를 반환하는 경우에만 작동하지 않습니까?
- 예 @howardh, 그 '이 맞습니다.
답변
- PID를 사용하여 항상 프로세스를 종료 할 수 있습니다. ” 터미널을 닫을 필요가 없습니다.
- 데몬과 같은 무한 루프에서 무언가를 실행하려면 백그라운드에 배치하는 것이 가장 좋습니다
-
while :
는 무한 루프를 생성하고[ 1 ]
while :; do COMMAND; done &
li 작성을 저장합니다. >
PID를 인쇄합니다. ctrl+d
를 사용하여 프롬프트를 종료하면 백그라운드 작업이 종료되지 않으며 나중에 kill PID
<를 사용하여 어디서나 작업을 종료 할 수 있습니다. / p>
PID를 잊어 버린 경우 pstree -pa $USER
또는 pgrep -fl ".*PROCESS.*"
를 사용하여 찾을 수 있습니다.
답변
다른 솔루션을 선호합니다.
touch .runcmd; while [ -f ".runcmd" ]; do COMMAND; sleep 1; done
순서대로 루프를 종료하려면 다음을 수행하십시오.
rm .runcmd && kill `pidof COMMAND`
답변
합리적으로 작동하는 것 저에게는 다음과 같습니다.
while sleep 1; do COMMAND; done
수면 1은 ctrl + c를 받으면 0이 아닌 값으로 반환되고 루프가 종료됩니다.
코멘트
- +1, 수면 시간도
0.5
또는0.1
:while sleep 0.1; do COMMAND; done
답변
trap
사용-
exit_() { exit } while true do echo "running.." trap exit_ int done