2017-01-18 1 views
0

을 열 때 나는이 간단한 bash는 스크립트가 신호에 응답하지 않습니다 내 배쉬 스크립트 :새로운 쉘 세션

#!/bin/bash 
trap "rm /testfile; service apache2 stop;" SIGTERM 
service apache2 start 
# Here I want to create new bash session for some reasons. 
/bin/bash 

지금은 somewhen이 스크립트에 SIGTERM하지만 을 보낼 수있는 또 다른 프로그램은 실제로 스크립트는하지 않습니다 일부 그 신호에 응답하면, 새로운 bash 세션 (새로운 bash 세션이 필요하기 때문에 시험을위한 것임)을 여는 대신 sleep infinity과 같은 다른 것을 사용할 때와 마찬가지로 새로운 bash 세션에 매달려 있습니다.

어떻게이 스크립트가 해당 SIGTERM에 응답 할 수 있습니까? 새 bash 세션이 어떻게 종료되는지는 중요하지 않습니다. 단지 trap에 쓰여진 내용이 실행되도록하고 싶습니다.

+0

@Fred는 다음과 같이 말합니다. 본질적으로'trap '앞에'service apache2 start'를 실행하고 있습니다 rm/testfile; service apache2 stop; " SIGTERM'는 이제까지 불렀다. 'trap'에'start'를 포함하고 싶을 것입니다. 아마'trap'을'stop' ('rm')과'start'를 동시에 수행하는 헬퍼 스크립트를 호출하는 것이 가장 좋습니다. (두 번째'/ bin/bash'가 도움이되지 않습니다.) –

+0

달성하고자하는 것은 무엇입니까? 왜 다른 프로세스는이 스크립트가 Apache를 멈추게하기 위해이 스크립트에 신호를 보내는 대신 Apache를 중지하지 않는 것입니까? – Fred

+0

이것을 확인하십시오 - http://unix.stackexchange.com/questions/146756/forward-sigterm-to-child-in-bash –

답변

1

트랩은 정의 된 쉘이 제어를 다시받을 때까지 호출되지 않습니다. bash를 실행하고이 새로운 프로세스가 제어권을 갖기 때문에 함정은 결코 호출되지 않습니다.

+0

쉘 스크립트가 신호를 받았을 때 sub-bash 세션을 어떻게 죽일 수 있을까? –

+0

"sub-bash"가 포어 그라운드 인 경우, 나는 할 수 있다고 생각하지 않습니다. 하지만 스크립트가 아파치를 죽이려하고 있습니다. "sub-bash"를 죽이고 싶다면 부모에게 신호를 보내지 않고 그 과정을 알리는 것이 어떻습니까? 참고로, 프로세스가 백그라운드에서 자식을 가지고 있다면, 실행중인 다음 명령이 종료 된 후에 신호를받습니다 (다른 프로세스가 끝나기를 기다리는 "wait"문에 의해 차단 된 경우 포함) 자식을 죽일 수 있습니다 . 내가 성취하려는 것을 이해했다면 아마도 뭔가 제안 할 수있을 것입니다. – Fred

+0

Docker를 안다면 일부 서비스를 시작하는 Docker 컨테이너를 시작한 다음 내 진입 점을 차단하는 대신 bash 세션을 시작하는 것이 좋을 것입니다 (예 : 꼬리). 따라서 bash가 더 의미가 있지만 그 경우에는 도커 중지 명령을 내리면 도커 컨테이너가 정상적으로 종료되지 않고 서비스가 정상적으로 종료되지 않고 종료됩니다. 그래서 parent bash에만 SIGTERM을 보내야한다. 왜냐하면 나는 부모 bash 만 다루는 docker stop을 사용하기 때문이다. 그게 가능하지 않다면 잊어 버리고 Bash와 함께 Docker 컨테이너를 시작하지 않을 것입니다 :), 감사합니다! –

관련 문제