Уничтожение поддерева процессов в Linux Bash
Я набираю небольшой bash-скрипт, который должен клонировать git-репозиторий, извлекать конкретную жестко закодированную ветку и прослушивать некоторые новые коммиты. Если обнаружены новые коммиты, скрипт должен убить работающий экземпляр MyApp, выполнить git pull и, наконец, собрать его с помощью gradle. Это должно также начаться через gradle снова.
Да, это Java-приложение с файлом сборки Gradle.
Это мой код:
##!/bin/bash
# GitHub Repository and Paths
GLOBAL_REPOSITORY="..."
LOCAL_REPOSITORY="..."
# Go to the repository
cd $LOCAL_REPOSITORY
# Clone the git repository if not already done
if [ ! -d "$LOCAL_REPOSITORY/.git" ]
then
git clone $GLOBAL_REPOSITORY $LOCAL_REPOSITORY
git checkout dev
fi
# Pull and build if there are new commits
LAST_GLOBAL_COMMIT=""
LAST_LOCAL_COMMIT=""
CHILDS_PID=""
while true; do
git fetch origin
LAST_GLOBAL_COMMIT="$(git rev-parse origin/dev)"
LAST_LOCAL_COMMIT="$(git rev-parse dev)"
if [ "$LAST_GLOBAL_COMMIT" != "$LAST_LOCAL_COMMIT" ]
then
if [ "$CHILDS_PID != "" ]
then
kill 9 "$CHILDS_PID" # Line 33
fi
LAST_LOCAL_COMMIT="$LAST_GLOBAL_COMMIT"
git pull origin dev
gradle
CHILDS_PID="$(gnome-terminal -e \"gradle run\" & echo $!)"
fi
sleep 300
done
Возникающая проблема заключается в том, что дочерний терминал, а также MyApp все еще работают. Кажется, только градл умирает. Но я хочу убить все дочерние процессы и затем запустить их снова. Только терминал, на котором запущен мой скрипт, не должен быть убит.
В реальной ситуации дерево процессов должно выглядеть так:
Main Terminal (Running the script)
|
|
Child Terminal
|
|
Gradle run
|
|
MyApplication
У меня вопрос, как я могу убить все эти процессы одновременно, кроме терминала в верхней части строки 33?
РЕДАКТИРОВАТЬ:
Разница здесь в том, что я искал способ найти главный узел поддерева и убить его на втором шаге.
Но я выяснил, вызывает ли экземпляр bash gnome-терминал или любой другой терминал, или tty, он выполняет процесс, который инициализирует раздвоенный терминал.
Так, например, терминал_1 имеет PID 42, и я запускаю через него другой терминал, затем он запускает процесс инициализации с PID 43, который инициализирует терминал_2, который будет иметь PID 44. Но терминал_1 получает только 43 как возвращаемое значение После этого процесс init умирает, и если вы пытаетесь убить PID 43, он логически говорит, что с этим PID процесса нет.
На данный момент отслеживание невозможно, и я решил свою проблему, написав AC-программу, которая использует fork самостоятельно.