用名称杀死随机进程

问题描述:

我想要一种杀死随名称的随机进程(例如随机perl进程)的方法。用名称杀死随机进程

这样做的最好方法是什么?

我thinkign使用像这样的:

ps aux | grep PROCESS-NAME 

到一个文件,然后找到一个随机的行号,得到了第二列(进程ID?)并杀死。

对我来说,它并不需要是一个随机的,只要它杀死其中一个进程即可。随意使它变得更好。

+1

启发你可以得到有关ServerFault这个问题更好的答案。这个问题在http:// serverfault上有一个近乎重复的问题。com/questions/71360/find-and-kill-old-processes – 2009-12-13 07:35:13

+0

好吧,我从来没有想过要在那里看看。上周才刚刚开始使用ServerFault。我试图检查Google并找不到它。 – Hintswen 2009-12-13 07:39:01

猛砸一个班轮:-P

kill `ps auxww | grep zsh | awk '{print $2}' | while read line; do echo "$RANDOM $line"; done | sort | cut -d ' ' -f 2 | head -n 1` 
+0

现在很酷。我喜欢一件衬衫!我可以将它保存在记事本中,并在需要时将其粘贴,而不是将其另存为脚本。 – Hintswen 2009-12-13 07:36:57

+0

你可以制作一个别名而不是副本,不是吗? – 2009-12-13 07:55:47

+1

-1用于使用太多冗余工具+不必要的管道。 – ghostdog74 2009-12-13 08:00:08

查看killall命令的-r选项!

+0

不会杀死所有匹配它的进程吗? – Hintswen 2009-12-13 08:20:31

+0

@Hintswen:是不是预期的功能,按名称杀死进程?换句话说:我不认为我明白你在问什么! – lexu 2009-12-14 19:51:01

+0

我想杀死一个具有特定名称的进程,其中会有多个进程具有相同的名称。被杀的人应该随机选择。我不希望所有人都被杀害。 – Hintswen 2009-12-14 21:16:36

听起来你已经走上了正轨。

您可以使用下面的perl脚本,它保存为randomline.pl,这将返回从什么管道输送到它的随机线

#!/usr/bin/perl 
srand (time^$$^unpack "%L*", `ps axww | gzip`); 
while (<>) { push(@_,$_); } print @_[rand()*@_]; 

然后运行下面的命令发送kill命令

kill `ps aux | grep PROCESS-NAME | perl randomline.pl | awk '{print $2}'` 

您可能还想添加一些检查,可能是使用反向grep for root,以确保您不会尝试杀死与进程名称匹配的根级进程。

+0

好的想法与检查。 – Hintswen 2009-12-13 07:37:34

另外还有“的pidof”命令,该命令可以用来杀死:

kill `pidof processname` 

得到的只是一个当有多个进程以相同的名称,使用-s作为“单次拍摄”。

+0

不会工作,多个进程具有相同的名称......所以他们都会同时被杀死。 – Hintswen 2009-12-13 08:19:45

+0

好点。我将编辑我的评论,以展示如何将它用awk来挑选出一个进程。 – 2009-12-13 18:24:46

+0

其实它有一个开关,-s。我编辑我的评论添加该选项 – 2009-12-13 18:28:19

只是杀死和awk。

kill $(ps -eo cmd,pid|awk '/zsh/&&!/awk/{pid[$NF]}END{for(i in pid){print i;exit}}') 

的在END块循环会给你一个随机的kill命令来杀死

最近的bash shell

#!/bin/bash 
declare -a pid 
pid=($(pidof myprocess)) 
length=${#pid} 
rnumber=$((RANDOM%length+1)) 
rand=$((rnumber-1)) 
kill ${pid[$rand]} 
+0

为什么你加1然后减1? – 2009-12-13 12:09:30

+0

加1,使生成的rand数包含上限。那么它的-1因为pid数组索引从0开始。 – ghostdog74 2009-12-13 13:01:36

如何因此,使用pgrep和pkill的。他们允许很多选项来选择过程。

名称为 “my_proc_name” 杀进程:

kill -9 `ps xf | grep my_proc_name | grep -v grep | cut -d " " -f 1` 

也许题外话,但我用这个在Cygwin。通过 Lev Victorovich Priyma’s answer

ps -W | awk '/calc.exe/,NF=1' | xargs kill -f 

ps -W | awk '$0~z,NF=1' z=calc.exe | xargs kill -f