2016-08-18 5 views
2

작업 제어를 쉘 스크립트로 활성화하면 (set -m 사용) 더 이상 프로세스 신호를 잡을 수 없습니다. 나는 위의 코드를 실행하고 나는 예를 Ctrl + C에 대한 누르면작업 제어가 스크립트에서 활성화되면 프로세스 신호를 잡을 수없는 이유는 무엇입니까?

#!/bin/bash 

set -m 

for i in `seq 15`; do 
    trap 'echo " Signal $i catched"' $i 
done 

while true; do 
    echo " Waiting for a process signal" 
    sleep 999 
done 

, 아무 일도 발생하지 : 다음 코드를 살펴보세요 그러나

Waiting for a process signal 
^CWaiting for a process signal 

을, 나는 set -m을 삭제하는 동일한 코드를 실행할 때

Waiting for a process signal 
^C Signal 15 catched 

내 질문

은 다음과 같습니다 :

    , 나는 대답을받을 수 있나요
  1. 왜 작동하지 않습니까?
  2. 작업 제어가 활성화되면 프로세스 신호를 잡을 수 있습니까?

참고 : sleep 대신 read을 사용하면 모든 프로세스에서 문제가 발생하지만 작동하지 않습니다.

+1

왜 처음부터 스크립트에서 작업 제어를 사용 하시겠습니까? – Barmar

+1

작업 제어는 쉘이 아닌 다른 프로세스 그룹에서 외부 프로그램을 실행하여 작동합니다. 키보드 신호는 포 그라운드 프로세스 그룹에만 보내지고 프로그램이 실행되는 동안 쉘은 포 그라운드 그룹에 있지 않습니다. – Barmar

+0

@Barmar 일부 경우 작업 제어는 스크립트에서 유용합니다. 예를 들어, 백그라운드에서 새 프로세스를 시작할 때 미래에 전체 프로세스 그룹을 제거해야한다면 그렇게 할 수 없습니다. 작업 제어가 사용 가능하지 않으면 새 프로세스 그룹이 작성되지 않으므로 작성된 모든 프로세스가 현재 그룹에 속하게됩니다. – Luisg123v

답변

3

해결 방법은 수면을 배경으로두고 수면이 완료되는 동안 bash 내장 문자 인 wait을 사용하는 것입니다. 따라서,이 시도 :

#!/bin/bash 

set -m 

for i in `seq 15`; do 
    trap 'echo " Signal $i catched"' $i 
done 

while true; do 
    echo " Waiting for a process signal" 
    sleep 999 & wait $! 
done 

샘플 실행 : 자세한 내용은

$ bash script 
Waiting for a process signal 
^C Signal 15 catched 
Waiting for a process signal 
^C Signal 15 catched 
Waiting for a process signal 

Greg's FAQ를 참조하십시오.

+1

이 솔루션을 더 효과적으로 만드는 것은 완벽하게 작동 할뿐만 아니라 호출 된 프로그램에서도 작동합니다. 왜냐하면 어떤 프로그램이 불려지더라도, 그것은 배경에 놓일 것이고, '대기'는 모든 신호를 포착하는 전경에있게 될 것입니다. – Luisg123v

관련 문제