我通常只运行少数Java应用程序,一个用于本地运行的服务器,另一个用于NetBeans等IDE。而且不时地,在大量重新部署之后,我的服务器陷入了OutOfMemoryException异常,因此我需要终止Java进程才能重新启动。
因此,我这样做了,pkill -9 java
但这也会杀死我不想运行的IDE。因此,我如何只杀死链接到正在运行的服务器的应用程序而不杀死其他应用程序?我假设它们都在同一进程中运行,但是必须有某种方法来区分它们。
PID
。非常感谢
我通常只运行少数Java应用程序,一个用于本地运行的服务器,另一个用于NetBeans等IDE。而且不时地,在大量重新部署之后,我的服务器陷入了OutOfMemoryException异常,因此我需要终止Java进程才能重新启动。
因此,我这样做了,pkill -9 java
但这也会杀死我不想运行的IDE。因此,我如何只杀死链接到正在运行的服务器的应用程序而不杀死其他应用程序?我假设它们都在同一进程中运行,但是必须有某种方法来区分它们。
PID
。非常感谢
Answers:
要终止与多个进程关联的进程,您需要通过使用与该进程关联的进程ID来终止该进程。
获取该Java进程运行的进程ID
ps -A |grep java
此命令的输出将提供在系统上运行的Java进程的列表。记下要杀死并运行该进程的进程ID(PID)
kill -9 PID
ps ax | grep java | grep -v 'grep' | cut -d '?' -f1 | xargs kill -9
IMO最好的解决方案是:
pkill -9 -f <nameOfYourJavaAplication>
ps -fC java
发现nameOfYourJavaAplication
(in -Dprogram.name
)
除了使用ps
和之外grep
,您可以使用ps
' -C
标志来选择所有名称为'java'的命令。您可能还需要使用ps
的-f
标志来打印列出的每个进程的完整命令名称。这样,您可以看到每个Java进程实际上在做什么。这是完整的命令:ps -fC java
。
您还可以pgrep
用来列出所有Java进程。pgrep -a java
将返回每个Java进程的PID和完整命令行。
获得要终止的命令的PID后,请kill
与-9
(SIGKILL)标志和您要终止的Java进程的PID一起使用。Java并非总是在收到“ SIGTERM”信号时停止(允许进程处理“ SIGTERM”),因此通常有必要向其发送“ SIGKILL”信号,从而使init杀死程序而不先警告它。
例如,如果ps -fC java
返回
UID PID PPID C STIME TTY TIME CMD
jeff 9014 8890 0 08:51 pts/0 00:00:00 java IDE
jeff 11775 8890 6 08:59 pts/0 00:00:00 java TestProgram
或psgrep -a java
返回
9014 java IDE
11775 java TestProgram
而你想杀人java TestProgram
,你应该跑kill -9 11775
。
如果您希望脚本使用程序命令行中的模式来查找并杀死(特定的)正在运行的程序(而不仅仅是您正在运行的每个Java程序),那么:
pgrep -f pattern # shows the PID
pkill -f pattern
jps
并jcmd
有专业只显示Java进程的信息和工具的PID。
您可以浏览它们的选项以获得更详细的输出。
这是一个可以使过程自动化的脚本。
用<PROCESS_NAME>
正在执行的Java 替换该部分。
#!/bin/sh
process=`ps -ef | grep -v awk | awk -e '/java.*<PROCESS_NAME>/ { print $2 }'`
kill ${process}
注意:我没有把-9
。除非您捕获信号并且SIGTERM
(默认)失败,否则不需要我。我还建议您使用信号名称,以便于阅读:
kill -TERM ${process}
警告
在执行之前,请kill ...
确保已$process
按预期设置变量。在ps -ef
Unix系统之间可能有所不同,所以awk
可能需要打印不同的参数。
注意
的 <PROCESS_NAME>
可以改变成一个变量。请记住,如果您每次必须在命令行上键入它,则可能偶尔会出错。我发现具有正确名称的脚本的多个副本更加容易。
同样重要的是:请注意awk
脚本的单引号。这意味着您需要关闭并重新打开字符串,并使用介于两者之间的变量。这样的事情应该起作用(未经测试):
process=`ps -ef | grep -v awk | awk -e '/java.*'"${PROCESS_NAME}"'/ { print $2 }'`
top
或ps
),然后选择正确的进程表并通过PID杀死它(kill -9 PID_number)。