SIGINT 또는 SIGTERM이 하위 프로세스가 아닌 상위 스크립트 자체로 전송될 때 명령 또는 함수 실행

SIGINT 또는 SIGTERM이 하위 프로세스가 아닌 상위 스크립트 자체로 전송될 때 명령 또는 함수 실행

나한테 이게 있다고 해보자.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_scriptSIGINTSIGTERM

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

관련 정보