У меня есть программа .sh, которая порождает несколько дочерних процессов, например так:
javac *.java
rmiregistry 3300 &
sleep 5
java Node 3300 3001 1 &
sleep 1
java Node 3300 3002 1 &
sleep 1
java Node 3300 3003 1 &
sleep 1
java Node 3300 3004 1 &
sleep 1
java Node 3300 3005 1 &
Теперь, когда я запускаю это на экране терминала, я хотел бы иметь возможность сделать что-то вроде ctr-c, чтобы остановить это. Однако, когда я делаю это, он не освобождает порты, занятые узлами. Есть ли способ убедиться, что когда я ctr-c, порты не связаны, или есть ярлык, который также освобождает порты, используемые дочерними процессами? Или мне нужно использовать отдельную команду kill? Также обратите внимание, что узлы могут запускать несколько потоков сами (из Java).
Способ уничтожить все задания, запущенные процессом, состоит в том, чтобы использовать идентификатор группы процесса (pgid). Самый простой способ видеть, что это для запуска сценария в фоновом режиме:
$ launch_java.sh &
[1] 25649
Числом, распечатанным выше, является PID launch_java.sh
который является также идентификатором группы, так как это запускает остальных. С другой стороны, можно найти его через ps
:
$ ps -a -o pgid,command | grep java
25649 java Node 3300 3002 1
1-е поле является pgid. После того как у Вас есть это, можно использовать kill
уничтожить его и все его дети:
kill -TERM -25649
Как объяснено в man kill
:
-n where n is larger than 1. All processes in process group
n are signaled. When an argument of the form '-n' is
given, and it is meant to denote a process group, either
a signal must be specified first, or the argument must be
preceded by a '--' option, otherwise it will be taken as
the signal to send.
используйте ps -aef
или ps -aux
команда, чтобы найти PID родителя детей и уничтожить его kill -9 PID
.