用Bash脚本查找并杀死带有某些参数的进程?


17

我想要一个脚本,该脚本杀死ssh使用-D参数运行的实例(设置本地代理)。

手动执行ps -A | grep -i ssh,使用-D查找实例,然后kill -9 {id}每个实例查找。

但是,bash脚本形式的外观是什么样的?

(我在Mac OS X上,但将通过安装任何必要的命令port


在Mac OS X上查看pgrep和pkill替代品吗?pgrep并且pkill是Solaris和Linux下的命令可靠地找到或杀进程的名字。
吉尔(Gilles)“所以,别再邪恶了”,

Answers:


26

运行pgrep -f "ssh.*-D",看看是否返回正确的进程ID。如果是这样,只需更改pgreppkill并保持相同的选项和样式

另外,kill -9除非绝对必要,否则不要使用aka SIGKILL,因为程序无法在退出前诱捕SIGKILL对其进行清理。我只kill -9在尝试了-1 -2和之后使用-3


您应该将kill的定义重新定义为每个for循环;)kill -ii
Seamus

1
pgrep不是OSX上的本机,您必须从第三方获得它。关于该主题的上一个主题有建议和替代方法。
吉尔(Gilles)“所以,别再邪恶了”,

男人还活着,我越用'nix,我就越喜欢它:)谢谢!
javamonkey79

pgrep和pkill在OS X 10.8(Mountain Lion)及更高版本中可用。 apple.blogoverflow.com/2012/07/…–
Peter Hanley

添加-a标记pgrep,使其不仅打印进程ID,而且打印命令(包括参数),可能会很有用。通过这种方式,很容易验证仅所需过程是否匹配。
luator


0

您可以利用proc文件系统来收集信息。例如:

for proc in $(grep -irl "ssh.*-D" /proc/*/cmdline | grep -v "self"); do if [ -f $proc ]; then cat $proc && echo ""; fi; done

这不是完美的,您需要一个更专用的正则表达式(特别是如果您正在杀死进程),但echo $proc | awk -F'/' '{ print $3 }'会向您显示进程的PID。


1
OSX没有/proc。并且已经有一个强大的工具可以执行此操作,称为pgrep(至少在Solaris和Linux上本机可用)。
吉尔斯(Gilles)“所以,别再邪恶了”,
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.