Скрипт Bash не уничтожается после того, как он убивает собственный PGID и все его дочерние процессы - PullRequest
1 голос
/ 13 июня 2019

script_sample.sh

#!/bin/bash
for sig in 13 15 18; do
    trap "kill -9 -$$;" $sig
done

hive -f hivescript.hql & 
PID=$!

while [ `ps ${PID} | wc -l` -gt 1 ]
do
    echo waiting
    sleep 5
done

Есть утилита, которая будет вызывать этот sample_script.sh, и когда я прерываю выполнение скрипта с помощью этой утилиты, скрипт получает СИГНАЛ 13 (SIGPIPE).

При получении сигнала процесс куста уничтожается, поскольку он находится в том же идентификаторе группы процессов, что и sample_script.sh. Однако скрипт продолжает работать вместе с командой sleep.

testuser 36223     1  0 13:13 ? 
     <sleep also runs> as child of 36223

Я также заметил, что иногда процесс улья также не убивается, но поведение является случайным.

  1. Почему kill -9 -PGID не уничтожает сам скрипт. - бывает всегда
  2. Любые предположения, почему дочерний процесс также иногда не прерывается - Случайно

1 Ответ

0 голосов
/ 14 июня 2019

Вопрос 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, который, я надеюсь, будет полезен.

...