优雅的方式杀死进程


12

用硒服务器完成我的bash脚本后,该脚本将其杀死,如下所示:

kill `ps -ef | grep selenium | awk '{ print $2 }'`

尽管此方法有效并且确实杀死了Selenium脚本,但它也尝试杀死进程。grep selenium因此,当进程号回到kill命令时,进程消失了,因此最终生成了一条错误消息。(换句话说:它最终杀死了两个进程,其中一个是真正的硒服务器,另一个是短暂的进程,这是我执行此命令的副作用。)

有没有更优雅的方式来杀死进程,而没有这种意想不到的副作用?

(我有一个想法:这个脚本在脚本中更早地启动selenium,所以也许如果有一种方法可以在我启动selenium时捕获PID,我可以保留它并直接杀死它,而不是grepping问题是,我不知道如何获取该PID,不知道如何使用变量来保存它,以及如何稍后在脚本中引用它。但这是更好的方法吗?)

Answers:


12

pkill selenium如果此方法或其他方法都不起作用,请尝试使用可以与其他管道序列一起使用方法的方法,例如

kill `ps -ef|grep -i selenium| grep -v grep| awk '{print $2}'`

为此,pkill在我的服务器上不起作用,但是改进的grep剥离会有所帮助。
Eric

20

尝试使用该pgrep命令,该命令将输出您感兴趣的命令的PID。

pgrep selenium

要实际终止该进程,请使用随附的pkill命令。

pkill selenium

我喜欢它的优雅,但是过程看起来像这样:“ root 26401 11997 2 23:20 pts / 1 00:00:00 java -jar /home/lm/cron/selenium-server-standalone-2.19.0。 jar”,因此我将其更改为pgrep java,并且可以:-)谢谢!
埃里克

2
如果为pgrep提供'-f'标志,它将与整个命令行匹配模式。因此,在这种情况下,杀死pgrep -f selenium应该起作用
mills013

7
使用pkill要简单得多。pkill使用与完全相同的匹配条件pgrep,因此您可以在1条命令中执行此操作,而不是2条命令(并且必须依靠输出一项)。
Patrick

7

尝试使用grep [s]elenium。这将找不到grep进程。


确实,这是一个方便的把戏。为什么行得通?

2
@ grephesse-默认情况下使用BRE。也就是说,[]在显示argvgrep,但它并不匹配,因为[]没有被字面上使用grep
克里斯·

我经常| grep -v grep在管道中使用组件。但这很优雅,我喜欢!
Alexios 2012年

如果您在当前工作目录中有一个与要复制的进程同名的文件,这(通常)是不够的。因此,我通常使用的解决方案是:ps -ef | grep \[s]elenium。尽管我发现lsof它是使用psand的更好的选择grep
Moreaki

2

killall命令没有被提及,我觉得这是对曲目的有用补充。

$ killall selenium

您还可以使用该-r regex选项来指定正则表达式以匹配进程名称,甚至是时间值:

$ killall -o 5m selenium 

杀死所有5分钟以上的硒过程。


这似乎是killall
ewwhite的

0

使用-m 1带有grep命令的开关仅获取第一个找到的进程。只要您按PID对进程进行升序排序,它将起作用。


1
您不能确定硒过程使用的是较低的PID。
FJRA 2012年

FJRA,较早启动的进程始终获得较低的PID。由于硒服务器在“ grep selenium”之前启动,因此它将获得较低的PID。
hellodanylo 2012年
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.