我有一个程序 .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 -aef
或ps -aux
命令 查找 子进程的父进程的 PID 并通过 将其杀死kill -9 PID
。