2017-01-18 7 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 

Теперь некоторые другая программа может когда-нибудь отправить SIGTERM на этот сценарий, но на самом деле скрипт не ответьте на этот сигнал, он продолжает висит в новом сеансе bash, в том же случае, когда я использую что-то вроде sleep infinity вместо открытия нового сеанса bash (это было просто для тестирования, потому что мне нужен этот сеанс bash).

Как я могу ответить на этот скрипт на этот SIGTERM? Не имеет значения, как будет завершена новая сессия bash, я просто хочу убедиться, что то, что я пишу в trap, будет выполнено.

+0

Как @Fred говорит. Вы, по сути, выполняете 'service apache2 start' перед' trap 'rm/testfile, service apache2 stop; " SIGTERM' когда-либо называется. Вы хотели бы включить 'start' в' trap'. Вероятно, лучше всего, чтобы '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» находится на переднем плане, я не думаю, что вы можете. Но ваш скрипт не пытается это сделать, он пытается убить Apache. Если вы хотите убить «sub-bash», почему бы вам не сигнализировать о его процессе, а не пытаться сигнализировать родитель? Для справки, если у процесса есть дети в фоновом режиме, он получит сигналы после следующей команды, которую он выполняет, заканчивается (в том числе, если он заблокирован оператором ожидания, ожидающим завершения какого-либо другого процесса), а затем может убить детей , Если бы я понял, чего вы пытаетесь достичь, возможно, я мог бы предложить что-то. – Fred

+0

Если вы знаете Docker, я запускаю контейнер Docker, который запускает некоторые сервисы, а затем я предпочитаю запускать сессию bash вместо того, чтобы блокировать мою точку входа каким-то образом (например, хвостом), поэтому bash имеет больше смысла, но в этом случае контейнер-докер не сможет выйти изящно при выдаче команды остановки докера, и мои службы будут убиты, а не изящно закрыты. Поэтому я должен отправить SIGTERM в родительский bash, потому что я использую остановку докера, которая имеет дело только с родительским bash. если это невозможно, так что я просто забуду это и не запустил свой контейнер Docker с Bash :), спасибо! –