Вопрос 1 : Проблема в том, что когда script_sample.sh
запускается с помощью другого скрипта, его pgid является pid его родителя, а не собственного pid.
Этот модифицированный скрипт долженработайте как хотите, явно запросив ps
для pgid, с оговоркой, что ловушка должна теперь убивать и родительский скрипт, и все остальное, что он вызывал, поэтому используйте с осторожностью!
#!/bin/bash
mypgid=`ps -o pgid $$ | tail -1 | sed 's/ //g'`
for sig in 13 15 18; do
trap "kill -9 -$mypgid;" $sig
done
...
Вопрос 2 : не уверен, мое исправление решает вопрос 1, но дочерний процесс все еще обычно выживает.Я попытался добавить kill -9 $PID;
в вашу ловушку, установить ее после запуска hive
, и все же мой дочерний процесс (сон в моих экспериментах) все еще обычно выживает.Как будто он попал в неубиваемую конюшню, о которой я не знал, что это возможно против kill -9
.Обратите внимание, что если я ^ C родитель, мой детский сон сохраняется, но если я kill -13
script_sample.sh
процесс, то мой дочерний процесс сна умирает.Я не понимаю, почему.
Другие частичные решения
Я искал более безопасные решения с намерением запустить script_sample.sh
в своей собственной группе pgid иУ меня нет ловушки, чтобы убить родительский скрипт, но мне пока не повезло.
Я думал об использовании setsid
, что должно позволить мне запускать процессы в новом сеансе, но это не меняетpgid так, как я бы хотел.
Я думал об использовании set -m
в верхней части script_sample.sh
, что заставляет каждую команду, которую он запускает, начинать с нового pgid (тогда ловушка должна kill -9 -$PID
итакже kill -9 $$
).Ловушка теперь ведет себя правильно, но все это ведет себя не по-новому, творчески убивая родителя - почему-то кажется, что родитель перестает сигнализировать script_sample.sh
, когда его убивают, и заставляет родителя игнорировать^ C.
Несмотря на всю эту частичную информацию, я публикую этот ответ, потому что я хотя бы ответил на вопрос 1, который, я надеюсь, будет полезен.