나는 백그라운드에서 실행되고 매시간 몇 가지 작업을 수행하는 스크립트를 원합니다. 신호가 수신되면 종료되어야 합니다. 마지막으로 종료하기 전에 몇 가지 정리 작업을 수행해야 합니다.
이 개념을 바탕으로 다음과 같이 썼습니다.
trap 'clean_up; exit' SIGTERM
while true
do
someActions
sleep 1h
done
스크립트를 실행합니다.
./script &
나는 스크립트를 죽인다.
kill -SIGTERM <pid>
스크립트가 예상대로 작동하지 않은 것으로 나타났습니다. 그 이유는 신호를 통해서만 잠자는 프로세스를 죽일 수 있기 때문이라고 생각합니다 SIGKILL
. 하지만 반면에 SIGKILL
나가기 전에 청소를 하라는 신호를 잡을 수는 없습니다.
그러면 프로세스가 백그라운드에서 대기하고 다른 신호를 수신할 때 종료되도록 만드는 방법은 무엇입니까 SIGKILL
?
답변1
"예상대로 작동하지 않는다"는 것은 SIGTERM 핸들러를 작성했지만 SIGTERM에 대해 실행되지 않았다는 의미입니다.코드에 실수가 있습니다.
다음은 실제 예입니다.
#!/bin/bash
cleanup () {
echo "goodbye!"
exit 0
}
trap 'cleanup' SIGTERM
while sleep 1; do
echo $BASHPID
done
반응은 예상대로였습니다 kill -SIGTERM
. 이미 알고 있는 SIGKILL 및 SIGSTOP을 제외하고 원하는 모든 신호를 사용할 수 있습니다.