무한 루프 종료

종료 할 때마다 자동으로 다시 실행하려는 명령이 있으므로 다음과 같이 실행했습니다.

while [ 1 ]; do COMMAND; done; 

하지만 Ctrl-c 로 루프를 중지 할 수없는 경우 COMMAND 전체 루프가 아닙니다.

유사하지만 터미널을 닫지 않고 멈출 수있는 방법은 무엇입니까?

댓글

  • ' bash에있는 경우 Ctrl-Z를 사용하여 작업을 중지 한 다음 " % 1을 종료합니다. div id = “8afb4ea65f”>

는 그것을 죽입니다.

  • 그냥 기다리십시오 … Linus는 다음과 같이 인용했습니다. “우리 모두는 Linux가 훌륭하다는 것을 알고 있습니다. 무한 루프를 수행합니다. 5 초만에 완료됩니다.”-정말 … 몇 초만 더 기다리면 완료됩니다.
  • @PaulCager도 저에게 효과적이었습니다. Ctrl-C가 작동하는 이유는 무엇입니까? 그렇지 않습니까?
  • @cirosantilli 외부 작업 (bash " 래퍼 "). 예를 들어, 어떤 상황에서는 ' " 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 

    댓글

    • 사실 이것은 보장되지 않는다는 점을 언급해야합니다. 많은 애플리케이션에서이 작업을 수행하지 않습니다.
    • @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, 그 '이 맞습니다.

    답변

    1. PID를 사용하여 항상 프로세스를 종료 할 수 있습니다. ” 터미널을 닫을 필요가 없습니다.
    2. 데몬과 같은 무한 루프에서 무언가를 실행하려면 백그라운드에 배치하는 것이 가장 좋습니다
    3. while :는 무한 루프를 생성하고 [ 1 ]

      while :; do COMMAND; done & 

    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  

    답글 남기기

    이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다