问题描述
我正在编写一个计算量大的代码,目前它经常崩溃,但我仍在研究它:)当它崩溃时,我无法关闭 GUI 窗口;我必须打开一个 shell 并杀死 -9 进程。
这是一个Java进程,很容易找到:
nkint@zefiro:~$ ps aux | grep java
nkint 2705 16.6 1.0 460928 43680 ? Sl 12:23 0:08 /usr/lib/jvm/java-6-sun-1.6.0.26/bin/java -Djava.library.path=something something
nkint 2809 0.0 0.0 4012 776 pts/0 S+ 12:24 0:00 grep --color=auto java
nkint@zefiro:~$ kill -9 2705
现在这很容易,但相当机械的任务。所以通常我会等待大约 7-8 个进程崩溃,然后每个进程都 kill -9
崩溃。
我想以自动方式执行此操作。我认为应该很容易通过管道传输一些命令来获取 ps aux | grep java
的 (n-1) 个结果的 id 并杀死它,但我不知道从哪里开始。
谁能给我任何提示吗?
最佳思路
如果要终止名为 java
的所有进程,可以使用以下命令:
\\n
killall -9 java
\\n
该命令向由其名称标识的进程发送信号。
次佳思路
再多几根管道就能到达您想去的地方。我是这样做的:
search_terms='whatever will help find the specific process'
kill $(ps aux | grep "$search_terms" | grep -v 'grep' | awk '{print $2}')
这里’s what’s发生:
grep -v 'grep'
从结果中排除 grep 进程。
awk '{print $2}'
仅打印输出的第二列(在本例中为 PID)
$(...)
是命令替换。基本上,内部命令的结果将用作 kill
的参数
这样做的好处是可以更好地控制被杀死的东西。例如,如果您在共享系统上,您可以编辑搜索词,使其仅尝试终止您自己的 java 进程。
第三种思路
打开文本编辑器并将这个简短的 bash 脚本保存在您的主目录中,名称为 ‘killjava’
#! /bin/bash
# Kill Java process
# Determine the pid
PID=`ps -C java -o pid=`
kill -9 $PID
然后在终端中输入 chmod u+x ~/killjava
,以便您可以执行该文件。
然后你可以从终端调用 ~/killjava
,你的 Java 进程就会死掉。你不妨考虑一下你用这种方式杀掉的Java进程的其他哪些资源(比如数据库连接)会受到影响。例如,也许 kill -15
会更合适 – 请参阅解释 here 。
第四种思路
这是基于 @Dean 之前的答案的另一种方法。\n
\n这使用 jps 来识别 java 进程。
kill $(jps | grep <MainClass> | awk '{print $1}')
MainClass 是正在运行的 java 程序中的一个类,其中包含 main 方法。