我写了一个非常短的脚本,获得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扩展的需要。
第二,我最初的做法是否存在根本性的错误/我是否遗漏了一些显而易见的东西否定了对此的需求?
感谢任何反馈。
在此先感谢,我(正如你所知)对此不熟悉。
答案 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;}'