Уничтожение поддерева процессов в 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 самостоятельно.

0 ответов

Другие вопросы по тегам