使用ps和awk获取pid,然后将其杀死

时间:2016-06-10 00:40:57

标签: bash awk alias kill ps

我写了一个非常短的脚本,获得1美元的pid然后杀死了这个过程。我有一些问题/要求改进。 (OSX)

#!/bin/bash

getpid=$(ps aux -O start | grep -i "$1" | grep -v grep | grep -v $0 | awk '{ if (NR==1) {print $2}}')

kill $getpid

例如:

$ ~/killpro.sh java

杀死了最新的java实例。

或者:

$ ~/killpro.sh chrome

显然要杀死谷歌浏览器。

首先,是否有任何实用的方法可以将它串在一起,使用read -p,这样它就可以反而成为别名并变成类似的东西:

$ killpro
$ Enter name: chrome
$

并不是说它显然更容易,实际上它的工作量稍微多一些,但是它绕过了输入路径和shell扩展的需要。

第二,我最初的做法是否存在根本性的错误/我是否遗漏了一些显而易见的东西否定了对此的需求?

感谢任何反馈。

在此先感谢,我(正如你所知)对此不熟悉。

3 个答案:

答案 0 :(得分:3)

我的建议是使用pkill代替。从手册页:

NAME
 pgrep, pkill -- find or signal processes by name

答案 1 :(得分:1)

大多数grep | awk的脚本都是useless use of grep,应该重构为只使用Awk。

#!/bin/bash

# Maybe add a case for $# > 1 and quit with an error message
# Or maybe loop over arguments if there is more than one
case $# in 0) read -p "Process name? " proc;; *) proc=$1;; esac

# Maybe your ps aux doesn't have the command in $11 -- adapt
kill $(ps aux -O start |
    awk -v name="$proc" 'NR>1 && tolower($11) ~ tolower(name) {print $2}')

您的评论表明您试图杀死最新的"进程(通过哪个度量标准?)但是您的代码和此代码会尝试终止所有实例。如果你想要最近启动的过程,PID不是一个好的指标;您应该查看流程开始时间等。ps的输出与系统有很大关系,因此如果需要帮助解决问题,您应该发布一个单独的问题,其中包含有关您操作系统的更多详细信息。

这个特殊的问题经常会在这里每月多次被打死,所以你应该看看其他实现的灵感。我的建议是"不要这样做"但既然你已经这样做了,我认为指出这些缺陷并尝试巩固代码是有道理的。但是,如果你没有令人信服的理由不能安装pkill,你应该只使用它(如果你这样做,使用经过适当调试和测试的脚本比从头开始编写自己的脚本更好)。

答案 2 :(得分:0)

你可以单独使用awk与getline调用ps并获取你想要的数据:

awk -vv_kp="bash" 'BEGIN{ cmd="ps -axu -O T | grep "v_kp" |head -1"; cmd | getline var; close(cmd); split(var,var2," ");print var2[2];}'

或更少awk,更多shell:

awk -vv_kp="bash" 'BEGIN{ cmd="ps -axu -O T | grep "v_kp" |head -1|cut -d\" \" -f2"; cmd | getline var; close(cmd); print var;}'