如何杀死除特定进程之外的所有进程


13

在我的本地服务器上,许多Java进程正在运行,同时我正在使用Eclipse。现在,当我需要重新启动进程(通过shell脚本启动进程)时,在每次启动之前,我需要通过以下方法杀死旧进程:

方法1 kill -9 $Pid :-(每个过程一个接一个,这很耗时)

方法2 :-( killall -9 java对于所有进程-都很简单,但是Eclipse会被不必要地杀死)

在方法2的情况下,Eclipse也将被杀死,这是我从未想要的。有什么办法吗?我敢肯定一定有:P

编辑:我正在使用ubuntu 15.04。


您在使用openjdk吗?
Maythux

不,它是java-7-oracle
Atiq

检查我的答案
Maythux

Answers:


17

试试这个命令:

ps ax | grep "java" | egrep -v "eclipse" | cut -b1-06 | xargs -t kill

这将搜索所有包含java和eclipse的进程,然后杀死它们


3
++ 1表示-9随意使用。您应该给进程一个优雅退出的机会。
Rmano

pgrepps | grep您有可能杀死grep语句本身更好。
2015年

2
@abligh问题在于pgrep您无法区分正在运行eclipse的进程,因为甚至pgrep -l只会报告java。@ Maythux仅供参考,egrep不建议使用,因为grep -E它完全一样,尽管您甚至不需要,grep -E因为您要匹配固定的字符串;所以就grep -v "eclipse"(或者如果您想看中[...] | grep -F "java" | grep -vF "eclipse | [...]"
kos

@kos:未经测试:pkill '/java\(.*eclipse\)\@!'
2015年

@abligh是什么\@!?如果那是一种Perl主义,那将是行不通的,因为它pkill仅支持ERE,因此我试图将整个任务简化为已经使用pkill负前瞻的单个命令,并且由于这个原因而失败了。
kos

12

使用 awk

ps ax | awk '/java/ && !/eclipse/ {system("kill "$1)}'

该命令将杀死所有java进程,但不会杀死该进程eclipse


3
更优雅(更快),然后来自@maythux恕我直言... ;-)
Fabby 2015年

我同意Fabby,很好!
kos

1

怎么样 :

pgrep -af 'java' | grep -Po '^[^ ]+(?!.*eclipse)' | xargs kill
  • pgrep -af 'java'java在进程的完整命令行中搜索并列出它们

  • grep -Po '^[^ ]+(?!.*eclipse)'在搜索到的进程中查找并获取eclipse其完整命令行中没有的进程的进程ID

  • xargs kill 会杀死进程。


+1是一个简短而优雅的解决方案。请注意,pkill如果pgrep/pkill您在上面的第二步中使用了受支持的perl regex,则可能会有一个更高效的解决方案(仅一个命令:)。不幸的是pgrep/ pkill仅支持extended-regexps(如egrep/grep -E)。
arielf

@arielf你绝对right..it将是最有效的,如果pgrep/ pkill支持PCRE ..
heemayl

0

jps -m | grep -v eclipse | awk '{print $1}' | xargs -t kill

使用jps可以确保您仅在查找Java命令,而不是在查找路径中包含Java的所有命令。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.