![프로세스를 백그라운드에서 기다리게 하고 KILL 이외의 신호에 의해 종료되는 방법](https://linux55.com/image/62788/%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EB%A5%BC%20%EB%B0%B1%EA%B7%B8%EB%9D%BC%EC%9A%B4%EB%93%9C%EC%97%90%EC%84%9C%20%EA%B8%B0%EB%8B%A4%EB%A6%AC%EA%B2%8C%20%ED%95%98%EA%B3%A0%20KILL%20%EC%9D%B4%EC%99%B8%EC%9D%98%20%EC%8B%A0%ED%98%B8%EC%97%90%20%EC%9D%98%ED%95%B4%20%EC%A2%85%EB%A3%8C%EB%90%98%EB%8A%94%20%EB%B0%A9%EB%B2%95.png)
나는 백그라운드에서 실행되고 매시간 몇 가지 작업을 수행하는 스크립트를 원합니다. 신호가 수신되면 종료되어야 합니다. 마지막으로 종료하기 전에 몇 가지 정리 작업을 수행해야 합니다.
이 개념을 바탕으로 다음과 같이 썼습니다.
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을 제외하고 원하는 모든 신호를 사용할 수 있습니다.