Почему сигнал SIGTERM не работает для группы процессов?
[EDIT] Я изменил SIGINT на SIGTERM в целом вопрос.
У меня есть скрипт, который запускает скрипт подпроцесса, который запускает jboss.
#!/bin/sh
....
start_jboss.sh &
trap 'kill -SIGTERM 0' EXIT HUP TERM INT
....
Я хочу отправить сигнал SIGTERM в jboss, когда мой сценарий был убит, завершен или прерван. Но приведенный выше код не заканчивается JBoss. KILL
сигнал убивает JBoss (следующий код), но JBoss не снимает блокировку базы данных H2. В моем случае важно снять блокировку H2, поэтому я должен использовать сигнал SIGTERM.
#!/bin/sh
....
start_jboss.sh &
trap 'kill -9 0' EXIT HUP TERM INT
....
Мой JBoss использует порт 8080, поэтому следующая команда дает мне pid JBoss:
sudo netstat -lnpt | grep 8080
Если я выполню следующую команду:
kill -SIGTERM jboss_pid_from_netstat_command
затем JBoss прерывается и снимает блокировку базы данных H2.
Как изменить мое действие ловушки для отправки SIGTERM
петь JBoss? Я не знаю, почему SIGKILL работает, а SIGTERM не работает.
[EDIT] Я изменил SIGINT на SIGTERM в целом вопрос.
РЕДАКТИРОВАТЬ
Стартовый скрипт JBoss (standalone.sh
) запускает JBoss в процессе переднего плана, если LAUNCH_JBOSS_IN_BACKGROUND
не устанавливается и запускает JBoss в фоновом режиме, если эта переменная установлена. Поэтому я установил эту переменную в своем скрипте. Следующие сценарии работают правильно тогда:
#!/bin/sh
....
export LAUNCH_JBOSS_IN_BACKGORUND=a
standalone.sh &
trap 'kill -SIGTERM 0' EXIT HUP TERM INT
....
#!/bin/sh
....
export LAUNCH_JBOSS_IN_BACKGORUND=a
standalone.sh &
trap 'kill -SIGTERM $(jobs -pr)' EXIT HUP TERM INT
....
#!/bin/sh
....
export LAUNCH_JBOSS_IN_BACKGORUND=a
standalone.sh &
jboss_script_id=$!
trap 'kill -SIGTERM $jboss_script_id' EXIT HUP TERM INT
....
Я до сих пор не знаю, почему следующий код не работает. Я работаю на Centos с Bash. Я проверил это на Ubuntu с тире и следующие коды работают, но core dump
предупреждение брошено.
(не работа)
#!/bin/sh
....
standalone.sh &
trap 'kill -SIGTERM 0' EXIT HUP TERM INT
....
или (не работает)
#!/bin/sh
....
standalone.sh &
trap 'kill -SIGTERM $(jobs -pr)' EXIT HUP TERM INT
....
или (не работает)
#!/bin/sh
....
standalone.sh &
jboss_script_id=$!
trap 'kill -SIGTERM $jboss_script_id' EXIT HUP TERM INT
....
2 ответа
Вероятно, что сервер jboss имеет обработчик завершения в том случае, если он был прерван во время обработки ввода-вывода (например, при записи в базу данных). TERM
а также INT
сигналы могут обрабатываться, чтобы гарантировать, что база данных не будет повреждена при поступлении сигнала и процесс занят выполнением операций ввода-вывода.
С SIGKILL
нет благодати - процесс выполняется безжалостно независимо от того, что он делает. Для сигнала SIGKILL не разрешен какой-либо обработчик. Это может быть важной причиной, чтобы избежать kill -9 для завершения процесса, если нет альтернативы.
По какой-то причине уничтожение всей группы процессов мешает корректному завершению и снятию блокировки базы данных. Попробуйте убить сервер jboss следующим образом. ПРИМЕЧАНИЕ. Возможно, вам потребуется расширить команду kill, чтобы убедиться, что все дочерние элементы сценария также умерли (я не знаю весь ваш сценарий).
trap 'kill -SIGTERM $(jobs -pr)' EXIT HUP TERM INT
Который убьет jboss как jobs
Команда вернет фоновые процессы, запущенные из оболочки (например, процесс jboss в вашем случае).
Я была такая же проблема.
Если вы хотите убить свой бег valgrind
процесс, Ctrl+C не будет делать это.
поскольку valgrind
обрабатывает некоторые сигналы, мы можем послать ему сигнал, чтобы он мог что-то сделать. Если вы не знаете список сигналов, вы можете проверить его, сказав (на терминале):
your_user_name:Directory$ kill -l
Эта команда выведет список всех доступных вам сигналов.
Запустите вашу программу с помощью valgrind (Пример:
valgrind --tool=memcheck ./prog
)Проверьте Valgrind PID на левой стороне. Пример: ==938== Memcheck, детектор ошибок памяти
Откройте другое окно терминала:
kill -SIGTRAP 938
Это должно работать для вас.
Если это не работает для вас, вы можете попробовать отправить другие сигналы, и я уверен, что вы найдете тот, который прерывает valgrind
и он все еще распечатывает отчет.