如何终止产生多个 Java 程序(每个程序占用一个端口)的进程

如何终止产生多个 Java 程序(每个程序占用一个端口)的进程

我有一个程序 .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 内部)。

答案1

终止进程启动的所有作业的方法是使用进程组 ID (pgid)。最简单的方法是在后台启动脚本:

$ launch_java.sh &
[1] 25649

上面打印的数字是 的 PID,launch_java.sh它也是组 ID,因为它启动了其余的进程。或者,您可以通过以下方式找到它ps

$ ps -a -o pgid,command | grep java
25649 java Node 3300 3002 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.

答案2

使用ps -aefps -aux命令 查找 子进程的父进程的 PID 并通过 将其杀死kill -9 PID

相关内容