随机杀死指定名称的进程

3

我希望有一种方法可以杀死一个随机进程,该进程具有特定的名称(例如随机perl进程)。

最好的方法是什么?

我想使用以下类似代码:

ps aux | grep PROCESS-NAME

将其写入文件,然后随机选取一行,获取第二列(进程ID?)并将其终止。

对于我的用途,它并不需要是随机的,只要终止其中一个进程即可。使其随机只会更好。


1
你可以在ServerFault上获得更好的答案。这个问题的近似重复在http://serverfault.com/questions/71360/find-and-kill-old-processes上。 - Chip Uni
啊,好的,我从来没有想过在那里找。上周才开始使用ServerFault。我试着在谷歌上查找,但没找到。 - Hintswen
9个回答

7

看看 killall 命令的 -r 选项!


这样做会不会杀掉所有匹配的进程? - Hintswen
@Hintswen:这不是预期的功能吗,通过名称终止进程?换句话说:我不认为我理解你在问什么! - lexu
我想杀死一个特定名称的单个进程,其中可能会有多个具有相同名称的进程。应该随机选择要终止的进程。我不想全部终止。 - Hintswen
明白了!谢谢!killall,顾名思义,会太过彻底! - lexu

4

Bash单行代码 :-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`

现在很酷。我喜欢一行代码!我可以将它保存在记事本中,需要时直接粘贴,而不必将其保存为脚本。 - Hintswen
你可以创建一个别名而不是复制粘贴,对吧? - Valentin Golev
我想我可以创建一个别名,但这只是我不会经常使用的东西,而且我总是在不同的服务器上使用它,所以没有太大意义。 - Hintswen
我不明白使用“冗余”工具和“不必要”的管道有什么问题...这不像是一个速度比赛!我认为,让管道在快速浏览时易读易懂,比“高尔夫”我的UNIX命令行更方便...更有保证,我不会意外地发出rm -r ~或其他类似的命令... - Steven Schlansker
这将找到“grep zsh”行,以及“man zshbuiltins”(例如)。一些sort版本具有-R随机排序选项,可以使您消除while循环。您在一个地方使用awk获取字段,在另一个地方使用cut只是为了变化? - Dennis Williamson
@Steven,你可以随意这样编写程序。我只是根据经验给你提供一个意见,那种写法会让你的脚本变得很慢,特别是在写更复杂的东西时。当我还是个新手的时候,我也像你这样写。之后我学会了不要做不必要的事情。 - ghostdog74

2

还有一个'pidof'命令,可以用来杀死进程:

kill `pidof processname`

为了在存在多个相同名称的进程时仅获取一个进程,请使用“-s”选项进行“单次快照”。

无法工作,有多个进程使用相同的名称...因此它们将同时被终止。 - Hintswen
好的建议。我会编辑我的评论,展示如何将其管道传输到awk以单独处理一个进程。 - Martin B
实际上有一个开关可以打开它,就是 -s。我编辑了我的评论以添加该选项。 - Martin B
-s 不会随机给出一个。 - Hintswen

0

杀死名为“my_proc_name”的进程:

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

0

听起来你已经在正确的轨道上了。

你可以使用以下 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 获取 root,以确保不会尝试杀死与进程名称匹配的根级进程。

0

只需使用kill和awk命令。

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

在 END 块中的 for 循环将会给你一个随机的进程 ID 来杀掉它


0

使用最近的Bash Shell

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

你为什么要加1再减去1? - Dennis Williamson
将1添加到随机数生成器中,以便包括上限。然后减去1,因为pid数组索引从0开始。 - ghostdog74

0

使用pgrep和pkill怎么样?它们允许选择进程的很多选项。


0

也许有些离题,但我在Cygwin上使用它。受Lev Victorovich Priyma的回答的启发。

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

或者

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接