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.