두 개의 스크립트가 있는데 하나는 다른 스크립트를 호출하고 얼마 후에는 그것을 종료해야합니다. 아주 기본적인 실습 예제가 아래에 나와 있습니다.다른 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"문을 수동으로 작성해야하는 추악한 해결 방법을 만들었습니다. 나에게별로 만족스럽지 않습니다 ...
앞으로 어떤 팁을 기대!
건배, 공원
Perfect! 마침내 작동합니다! – koenlek
이것은'setid' 명령이없는 맥에서는 작동하지 않습니다. –