나한테 이게 있다고 해보자.script.sh
#!/bin/bash
exit_script() {
echo "Printing something special!"
echo "Maybe executing other commands!"
kill -- -$$ # Sends SIGTERM to child/sub processes
}
echo "Some other text"
#other commands here
sleep infinity
수신 시 또는 예를 들어 다음과 script.sh
같은 기능을 실행하고 싶습니다.exit_script
SIGINT
SIGTERM
killall script.sh # it will send SIGTERM to my script
내 스크립트가 이것을 실행하기를 원합니다
exit_script() {
echo "Printing something special!"
echo "Maybe executing other commands!"
kill -- -$$ # Sends SIGTERM to child/sub processes
}
나는 다음을 사용하여 이 기능을 달성하려고 합니다.trap
trap exit_script SIGINT SIGTERM
내 질문에 답한 사람은 내가 틀렸다는 것을 증명했습니다. 그러나 자식/자식 프로세스로 전송된 신호에만 반응하는 것처럼 보이기
때문에 작동하지 않습니다 . trap
초보자로서 trap
매뉴얼 페이지를 해독할 수 없으므로 해결책이 누락되었을 수 있습니다.
내 생각엔 이것이 Chromium과 같은 "실제" 프로그램이 전송할 때 수행하는 작업인 것 같습니다.SIGTERM
~에서https://major.io/2010/03/18/sigterm-vs-sigkill/
SIGTERM을 받으면 애플리케이션은 수행할 작업을 결정할 수 있습니다. 대부분의 응용 프로그램은 리소스를 정리하고 중지하지만 일부 응용 프로그램은 그렇지 않을 수도 있습니다.
답변1
trap
호출 프로세스 신호 자체에 반응합니다. 하지만 신호를 받기 전에 호출해야 합니다. 내 말은, 스크립트 시작 부분에.
또한 이를 사용하여 kill -- -$$
스크립트에 신호를 보내려면 kill을 실행하기 전에 트랩을 지워야 합니다. 그렇지 않으면 무한대로 끝날 것입니다.킬&트랩반지 모양.
예를 들어:
#!/bin/bash
exit_script() {
echo "Printing something special!"
echo "Maybe executing other commands!"
trap - SIGINT SIGTERM # clear the trap
kill -- -$$ # Sends SIGTERM to child/sub processes
}
trap exit_script SIGINT SIGTERM
echo "Some other text"
#other commands here
sleep infinity
주석에 설명된 대로 문제는 스크립트가 신호를 수신하지만 수신된 신호를 처리하기 전에 슬립 루틴이 끝나기를 기다리고 있다는 것입니다. 따라서 트랩 작업을 실행하려면 하위 프로세스(이 경우 휴면 프로세스)를 종료해야 합니다. 다음과 같은 방법을 사용하여 이 작업을 수행할 수 있습니다.
kill -- -$(pgrep script.sh)
아니면 댓글에서 언급했듯이:
killall -g script.sh