ctrl+c /not/ while 루프를 중단시키는 방법은 무엇입니까?

ctrl+c /not/ while 루프를 중단시키는 방법은 무엇입니까?

이 루프가 주어지면:

while sleep 10s ; do
  something-that-runs-forever
done

Ctrl+C를 누르면 전체 while 루프가 중단됩니다. 내가 원하는 것은 "무언가" 프로세스를 중단하고 10초가 지나기를 기다린 다음 "무언가"를 다시 시작하는 것입니다.

ctrl+c가 while 루프가 아닌 "무언가"에만 영향을 미치게 만드는 방법은 무엇입니까?

편집: "인터럽트"는 SIGINT와 동일합니다. 죽이다. 중단합니다. 종료. "일시 정지"의 "인터럽트"가 아닙니다.

답변1

그냥 trap SIGINT뭔가를 하러 가면 효과가 있을 것입니다. 좋다 :( true).

#!/bin/sh
trap ":" INT    
while sleep 10s ; do
    something-that-runs-forever
done

중단해도 something...신호를 무시하기 때문에 이제 쉘이 종료되지 않습니다. 그러나 sleep프로세스를 ^C하면 종료에 실패하므로 루프가 중지됩니다. 이를 방지하려면 sleep루프 내부로 이동하거나 유사한 것을 추가하십시오.|| true

신호를 완전히 무시 하는 경우 trap "" INT(명령을 할당하는 대신) 하위 프로세스에서도 무시되므로 어느 쪽도 중단할 수 없습니다 something.... 이것은 적어도배쉬 매뉴얼:

만약에아르기닌빈 문자열이고 지정된 각 신호는 다음과 같습니다.신호 사양쉘과 쉘이 호출하는 명령에 의해 무시됩니다.[...] 셸에 들어갈 때 무시되는 신호는 포착하거나 재설정할 수 없습니다.

답변2

또 다른 옵션은 something-that-runs-forever신호를 처리하는 것입니다(신호를 받은 후 정상적으로 종료). 물론 이는 프로그램이 많은 스크립트에서 사용되고 CTRL원하는 동작이 + C시스템에서 동일한 경우에만 의미가 있습니다. 스크립트를 계속 실행합니다.

관련 정보