Установить идентификатор родительского процесса из ShellScript, позже удалить все дочерние процессы

Я хочу написать сценарий оболочки для моей машины Ubuntu, которая запускает несколько серверных приложений. Мне нужен этот скрипт, чтобы выполнить его из моего java-приложения. Но мне нужен простой способ группировать все эти серверные процессы, чтобы позднее можно было убить все серверные процессы из моего приложения Java.

Моя идея – установить родительский идентификатор процесса из моего сценария оболочки и убить их в более поздний момент с pkill команды pkill .

Как я могу сделать все это из сценария оболочки?

Вы можете запускать экземпляры сервера Appium, отмечая их PID, который вы можете использовать позже, чтобы убить. например

 Appium_server_1 & instance1=$! Appium_server_2 & instance2=$! Appium_server_3 & instance3=$! . . . 

а затем вы можете убить все экземпляры переменной командой kill .

Если ваша оболочка поддерживает встроенную переменную PPID , вы можете использовать эту переменную, если вы действительно заинтересованы в PID процесса, который называется оболочкой.

Если вы заинтересованы в PID этой оболочки и хотите дать ее другим, используйте $$ .

Если я правильно понял ваш вопрос, ответ – вы не можете этого сделать. Программа java запускается, вызывает сценарий оболочки, который запускает больше процессов. Затем завершается сценарий оболочки, и вы хотите, чтобы элемент управления передавался в java-процесс, который должен был бы отключать все остальные процессы.

Короткий ответ: вы не можете этого сделать. Когда скрипт оболочки умирает, все запущенные им процессы становятся владельцами процесса номер 1 (init), а не процесса java.

Есть ли причина, почему вы используете сценарий оболочки для запуска дополнительных процессов?

Почему бы просто не использовать java для запуска всех процессов (используя библиотеки процессов) или использовать что-то вроде supervisord ( http://supervisord.org/ ). Таким образом, вы можете контролировать суперзавод для запуска / остановки процессов из программы java.

Если все процессы называются одинаковыми, вы также можете использовать команду killall, чтобы убить их по имени.