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


11

이 루프가 주어지면 :

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

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

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

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


일시 중지하려면 Ctrl + Z를 사용하지 말고 10 초 동안 기다렸다가 실행하십시오 fg. 왜 Ctrl + C를 사용합니까?
terdon

@ terdon : 댓글 주셔서 감사합니다, 나는 대답에 서두를 수 있습니다. 운영 요구 사항에 대한 자세한 내용이 필요합니다
Inian

@ terdon : 일시 중지하고 싶지 않습니다. 내가 쓴 것처럼 10 초가 지나고 싶습니다.
bos

당신은 말했다 : What I want to do is to interrupt the "something"-process, let 10 seconds pass, and then restart "something". Ctrl + Z를 누르고 10 초를 기다렸다가 실행 fg하면 바로 그 일이 발생합니다. 어쩌면 당신은 수있는 편집 질문을 우리가 더 잘 이해 할 수 있도록 구체적인 예제를 제공?
terdon

3
나는 Ctrl + C 인터럽트의 맥락에서 모호하지 않다고 생각했지만 분명히 틀렸다. 나는 지금 편집했다.
bos

답변:


18

당신 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는 쉘과는 호출 명령에 의해 무시됩니다. [...] 쉘에 진입 할 때 무시 된 신호는 트랩하거나 재설정 할 수 없습니다.


현재 쉘에서도 이것이 가능합니까? (스크립트에 없음)

1
do (trap - INT; something-that-runs-forever)명령 인터럽트를 허용 할 수 있습니다 . 또한 실행할 필요가 없습니다 :. 빈 문자열을 사용하여 신호를 무시할 수 있습니다 trap '' INT. 이 모든 것은 POSIX이며 모든 Bash가 아닌 호환되는 쉘에서 작동해야합니다.
Toby Speight

참고도 쓰고 있음을 SIGINT전액하는 것은 엄격하게 이식 할 수 없습니다 : " 구현이와 함께 이름을 허용 할 수있다 SIG접두사 또는 신호 이름의 경우 무시 확장으로를 . (내 강조)"
토비 Speight

신호를 무시하는 동작으로 빈 문자열을 전달할 수 있습니다 trap "" INT( 예 : posix)
daf

@TobySpeight, 내가 사용하는 이유를 trap :대신 trap ""하는 것을 정확하게이었다 없는 우리의 주요 방해 할 수있는 다른 작업을 수행 할 필요가 없습니다 그래서 무시 신호가 (하지만 대신 무 조작하게) something프로그램을.
ilkkachu

0

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


ITYM "정상적으로 나가지"않고 "자기 재실행"?
Toby Speight
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.