TL; DR
Используйте setsid
вместо nohup
в вашем parent.sh
:
#!/bin/bash
setsid $@ &
Первая проблема заключается вваша Java-программа получает сигнал SIGTERM
(после CTRL + C
), JVM отправляет сигнал SIGKILL
дочерним процессам, который не может быть перехвачен, заблокирован или проигнорирован.Итак, как только ваш parent.sh
процесс получает SIGKILL
, он передается дочернему процессу sub.sh
, который останавливает процесс.
Вторая проблема связана с nohup "$@" &
, когда ваша дочерняя программа sub.sh
запускается в фоновом режиме, но она не полностью отсоединена от текущего терминала.nohup
в основном игнорирует сигнал SIGHUP
.Он выполняет процесс нормально (в фоновом режиме) и фактически не обеспечивает демонизацию.
Вместо nohup
, вы можете использовать setsid , который отсоединяет дочерний процесс sub.sh
отсоздание нового сеанса, который затем не будет иметь управляющего терминала и, следовательно, не получит сигнал SIGKILL
.
Еще один способ сделать это может использовать disown
, напримерsource $@ & disown
, но в этом случае он не заблокирует текущий терминал, на котором работает parent.sh
.Проблема в том, что вы не сможете узнать, когда завершится дочерний процесс.Таким образом, у вас будет больше работы, чтобы отслеживать идентификатор дочернего процесса.
Дополнительные примечания: