我经常需要在编程过程中杀死一个进程。
我现在的方法是:
[~]$ ps aux | grep 'python csp_build.py'
user 5124 1.0 0.3 214588 13852 pts/4 Sl+ 11:19 0:00 python csp_build.py
user 5373 0.0 0.0 8096 960 pts/6 S+ 11:20 0:00 grep python csp_build.py
[~]$ kill 5124
如何自动提取进程 ID 并在同一行中将其杀死?
像这样:
[~]$ ps aux | grep 'python csp_build.py' | kill <regex that returns the pid>
在bash
,您应该能够执行以下操作:
kill $(ps aux | grep '[p]ython csp_build.py' | awk '{print $2}')
其工作细节如下:
ps
为您提供了所有进程的列表。grep
过滤器会根据您的搜索字符串[p]
过滤,这是一种技巧,可阻止您grep
进程。awk
只是给您每行的第二个字段,即 PID。$(x)
构造意味着执行x
然后获取其输出并将其放在命令行中。上面构造中的ps
管道的输出是进程 ID 的列表,因此您最终得到的命令是kill 1234 1122 7654
。这是一个记录,显示了它的作用:
pax> sleep 3600 &
[1] 2225
pax> sleep 3600 &
[2] 2226
pax> sleep 3600 &
[3] 2227
pax> sleep 3600 &
[4] 2228
pax> sleep 3600 &
[5] 2229
pax> kill $(ps aux | grep '[s]leep' | awk '{print $2}')
[5]+ Terminated sleep 3600
[1] Terminated sleep 3600
[2] Terminated sleep 3600
[3]- Terminated sleep 3600
[4]+ Terminated sleep 3600
您会看到它终止了所有的卧铺车厢。
更详细地解释grep '[p]ython csp_build.py'
当您sleep 3600 &
接着是ps -ef | grep sleep
,您倾向于获得两个带有sleep
进程,即sleep 3600
和grep sleep
(因为它们都sleep
,这不是火箭科学)。
但是, ps -ef | grep '[s]leep'
不会创建一个带有sleep
的进程,而是创建grep '[s]leep'
,这有点棘手: grep
找不到它,因为它正在寻找正则表达式 “ any 字符类[s]
(是s
)中leep
。
换句话说,它正在寻找sleep
但是 grep 进程是grep '[s]leep'
,其中没有sleep
。
当我(有人在 SO 上显示给我看)时,我立即开始使用它,因为
| grep -v grep
少了一个过程。 | grep -v grep
; 和如果你有杀伤力,
pkill -f csp_build.py
如果只想对进程名称(而不是完整的参数列表)进行 grep 设置,请不要使用-f
。
ps aux | grep -i csp_build | awk '{print $2}' | xargs sudo kill -9
awk '{print $2}'
sudo
是可选的kill -9 5124
, kill -9 5373
等(kill -15 更为优美,但稍微慢一些)我在. bash_profile 中定义了 2 个快捷方式功能(〜/ .bash_profile 用于 osx,您必须查看对 * nix 机器有效的功能)。
p csp_build
, p python
等bash_profile 代码:
# FIND PROCESS
function p(){
ps aux | grep -i $1 | grep -v grep
}
ka csp_build
, ka python
等ka csp_build 15
, ka python 9
bash_profile 代码:
# KILL ALL
function ka(){
cnt=$( p $1 | wc -l) # total count of processes found
klevel=${2:-15} # kill level, defaults to 15 if argument 2 is empty
echo -e "\nSearching for '$1' -- Found" $cnt "Running Processes .. "
p $1
echo -e '\nTerminating' $cnt 'processes .. '
ps aux | grep -i $1 | grep -v grep | awk '{print $2}' | xargs sudo kill -klevel
echo -e "Done!\n"
echo "Running search again:"
p "$1"
echo -e "\n"
}