[unix] while 루프를 ctrl + c / not / 인터럽트로 만드는 방법은 무엇입니까?

이 루프가 주어지면 :

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

Ctrl + C를 누르면 전체 while 루프가 중단됩니다. 내가하고 싶은 것은 “무언가”-프로세스를 중단하고 10 초가 지난 다음 “무언가”를 다시 시작하는 것입니다.

ctrl + c는 while 루프가 아닌 “무언가”에만 영향을 미치려면 어떻게해야합니까?

편집 : SIGINT에서와 같이 “인터럽트”. 죽임. 중단 끝내다. “일시 정지”에서와 같이 “중단”되지 않습니다.



답변

당신 trap SIGINT이 뭔가를 하면 효과가 있습니다 . :( true) 처럼

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

중단하면 something...쉘이 신호를 무시하기 때문에 쉘이 종료되지 않습니다. 그러나 sleep프로세스 를 ^ C하면 실패와 함께 종료되고 루프로 인해 루프가 중지됩니다. sleep루프 내부로를 이동 하거나 || true방지하기 위해 무언가를 추가하십시오 .

trap "" INT신호를 명령에 할당하는 대신 신호를 완전히 무시하는 데 사용 하면 하위 프로세스에서도 무시되므로 무시할 수 없습니다 something.... 이것은 적어도 Bash의 매뉴얼 에 명시 적으로 언급되어 있습니다 .

경우 인수가 널 (null) 문자열입니다, 다음 각에 의해 지정된 신호 sigspec는 쉘과는 호출 명령에 의해 무시됩니다. […]
쉘에 진입 할 때 무시 된 신호는 트랩하거나 재설정 할 수 없습니다.


답변

다른 옵션은 something-that-runs-forever신호를 처리하는 것입니다 (수신되면 정상적으로 종료 됨). 물론,이 프로그램이 많은 스크립트에서 사용될 때만 수행하는 것이 합리적이며 CTRL+ 에서 원하는 동작 C은 체계적으로 동일하므로 스크립트 실행을 계속합니다.


답변