2012-10-10 3 views
8

몇 가지 읽기 작업을 수행하는 장치를 마운트 및 마운트 해제하는 bash 스크립트가 있습니다. 장치가 매우 느리기 때문에 스크립트를 완료하는 데 약 15 초 (적어도 5-6 초 소요)가 소요됩니다. 이 장치를 마운트 된 상태로두면 다른 문제가 발생할 수 있으므로이 스크립트를 중단하지 마십시오.Bash 스크립트 : SIGTSTP를 올바르게 처리 할 수 ​​없음

SIGINT (Ctrl + c)를 올바르게 처리 할 수 ​​있지만 SIGTSTP (Ctrl + z)를 처리하려고하면 스크립트가 멈 춥니 다. 즉, 신호가 트랩되었지만 처리기가 실행되지 않습니다.

#!/bin/sh 
cleanup() 
{ 
    # Don't worry about unmounting yet. Just checking if trap works. 
    echo "Quitting..." > /dev/tty 
    exit 0 
} 
trap 'cleanup' SIGTSTP 
... 

수동으로 KILL 신호를 처리해야합니다. 왜 이런 일이 일어나고 어떻게 해결할 수 있습니까?

답변

4

현재 실행중인 프로세스가 종료 될 때까지 쉘은 트랩을 실행하지 않습니다. (적어도 bash 3.00.15의 동작입니다).^c를 통해 SIGINT를 보내면 포 그라운드 프로세스 그룹의 모든 프로세스로 전송됩니다. 현재 실행중인 프로그램이이를 수신하고 종료하면 bash는 트랩을 실행할 수 있습니다. 비슷하게^z를 통한 SIGTSTP; bash는 신호를 수신하지만 실행중인 프로그램이 종료 될 때까지 트랩을 실행하지 않으며 기본 동작을 취하고 일시 중단 된 경우에는 수행하지 않습니다. ...을 간단한 read f으로 바꾸고 트랩이 즉시 실행된다는 점에 유의하십시오.

+0

그렇게 많은 의미가 있습니다. 따라서 스크립트로 실행하는 모든 바이너리가^z를 처리하지 않으면^z를 적절하게 처리 할 수있는 방법이 없습니다. 그게 맞습니까? – Ram

+0

setsid에서 비동기 적으로 작업을 실행하고 기다릴 수 있습니다. 예 :'cmd' 대신에'setsid cmd & wait'. –

+0

그렇게 보입니다. 도와 주셔서 감사합니다! 그러나 궁금한 점이 있더라도 새로운 세션에서 프로세스가 중단되지는 않습니까? – Ram

관련 문제