2014-08-27 5 views
0

두 개의 스크립트가 있는데 하나는 다른 스크립트를 호출하고 얼마 후에는 그것을 종료해야합니다. 아주 기본적인 실습 예제가 아래에 나와 있습니다.다른 bash 스크립트에서 실행되는 bash 스크립트를 올바르게 sigint하는 방법은 무엇입니까?

main_script.sh :

#!/bin/bash 
cd "${0%/*}" #make current working directory the folder of this script 
./record.sh & 
PID=$! 
# perform some other commands 
sleep 5 
kill -s SIGINT $PID 
#wait $PID 
echo "Finished" 

record.sh :

#!/bin/bash 
cd "${0%/*}" #make current working directory the folder of this script 
RECORD_PIDS=1 
printf "WallTimeStart: %f\n\n" $(date +%s.%N) >> test.txt 
top -b -p $RECORD_PIDS -d 1.00 >> test.txt 
printf "WallTimeEnd: %f\n\n" $(date +%s.%N) >> test.txt 

지금은 마무리에, 그것은하지 않습니다 잘 가까운 record.sh main_script.sh를 실행하는 경우 : 상단 명령을 것입니다 main_script가 끝나고 SIGINT를 사용하여 레코드 스크립트가 종료 되더라도 백그라운드에서 계속 실행하십시오 (test.txt는 맨 처음 프로세스를 수동으로 종료 할 때까지 커집니다).

main_script.sh를 Ctrl + C로 누르면 모든 것이 제대로 종료됩니다. record.sh를 자체적으로 실행하고 ctrl + c를 실행하면 모든 것이 올바르게 종료됩니다.

내가 주석 처리를 제거하면 스크립트가 중단되고 Ctrl + Z를 눌러야합니다.

SIGINT, EXIT 및/또는 SIGTERM을받을 때 '트랩'을 사용하여 일부 정리 스크립트를 시작하는 등 모든 종류의 작업을 이미 시도했지만 아무 것도 작동하지 않았습니다. 나는 또한 fg를 사용하여 전경으로 record.sh를 다시 가져 오려고했지만 그 역시 도움이되지 못했다. 나는 운이 좋게도 불행하게도 이미 거의 하루를 이미 찾고 있습니다. Pidof를 사용하여 수동으로 (main_script.sh에서) 최상위 프로세스를 찾은 다음 main_script.sh에서 "WallTimeEnd"문을 수동으로 작성해야하는 추악한 해결 방법을 만들었습니다. 나에게별로 만족스럽지 않습니다 ...

앞으로 어떤 팁을 기대!

건배, 공원

답변

3

귀하의 문제는 SIGINT 오히려 top보다는 bash에 전달된다는 점이다.

#!/bin/bash 
cd "${0%/*}" #make current working directory the folder of this script 
setsid ./record.sh & 
PID=$! 
# perform some other commands 
sleep 5 
kill -s SIGINT -$PID 
wait $PID 
echo "Finished" 

이 새로운 프로세스 그룹의 서브 스크립트를 시작하고 -pid가에서 모든 프로세스를 알리기 위해 kill을 알려줍니다 : 하나의 옵션은 새로운 세션을 사용하고 같은 대신 프로세스 그룹에 신호를 보내는 것 해당 그룹에는 top이 포함됩니다.

+0

Perfect! 마침내 작동합니다! – koenlek

+0

이것은'setid' 명령이없는 맥에서는 작동하지 않습니다. –