使用bash和regex在一行中查找并杀死一个进程
我经常需要在编程期间杀死一个进程。
我现在这样做的方式是:
[~]$ 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
给你所有进程的列表。 - 基于你的searchstring的
grep
filter,[p]
是一个伎俩,阻止你拿起实际的grep
进程本身。 -
awk
只是给你每行的第二个字段,即PID。 -
$(x)
构造意味着执行x
然后将其输出放在命令行上。 上面那个构造里面的那个ps
pipe道的输出是进程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
ps -ef | grep sleep
,你往往会得到两个 sleep
过程, sleep 3600
和grep sleep
(因为他们都sleep
在里面,这不是火箭科学)。
但是, ps -ef | grep '[s]leep'
ps -ef | grep '[s]leep'
不会创build一个包含sleep
的进程,而是创buildgrep '[s]leep'
,这里有一个棘手的问题: grep
找不到它,因为它正在寻找正则expression式“any从字符类( s
)开始,然后是leep
。
换句话说,它正在寻找sleep
但grep进程是grep '[s]leep'
,它没有sleep
。
当我看到这个(在这里的人),我立即开始使用它,因为
- 这比添加
| grep -v grep
less了一个过程| grep -v grep
; 和 - 它的优雅和鬼祟,一个罕见的组合:-)
如果你有pkill,
pkill -f csp_build.py
如果你只想grep进程名称(而不是完整的参数列表),那么离开-f
。
一个class轮:
ps aux | grep -i csp_build | awk '{print $2}' | xargs sudo kill -9
- 打印出第2列:
awk '{print $2}'
-
sudo
是可选的 - 运行
kill -9 5124
,kill -9 5373
等(杀-15更优雅,但稍慢)
奖金:
我也在我的.bash_profile中定义了2个快捷方式函数(〜/ .bash_profile用于osx,你必须看看你的* nix机器有什么作用)。
- p 关键字
- 列出包含关键字的所有P进程
- 用法例如:
p csp_build
,p python
等
bash_profile代码:
# FIND PROCESS function p(){ ps aux | grep -i $1 | grep -v grep }
- ka 关键字
- K ills会有这个关键字的进程
- 用法如:
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" }
尝试使用
ps aux | grep 'python csp_build.py' | head -1 | cut -d " " -f 2 | xargs kill
killall -r regexp -r, --regexp
将进程名称模式解释为扩展的正则expression式。
您可能只使用pkill '^python*'
进行正则expression式进程查杀。
如果你想看看杀死或查找什么,只需使用pgrep -l '^python*'
,其中-l输出也是进程的名称。 如果你不想使用pkill
,只需使用:
pgrep '^python*' | xargs kill
你可以用awk和backtics做到这一点
ps auxf |grep 'python csp_build.py'|`awk '{ print "kill " $2 }'`
awk中的$ 2打印第2列,而backtics运行打印的语句。
但是一个更简洁的解决scheme是让python进程将进程ID存储在/ var / run中,然后你可以直接读取该文件并将其杀死。
使用pgrep – 在许多平台上可用:
kill -9 `pgrep -f cps_build`
pgrep -f将返回所有符合条件的PID“cps_build”
ps -o uid,pid,cmd|awk '{if($1=="username" && $3=="your command") print $2}'|xargs kill -15
我的任务是杀死与特定目录中放置的正则expression式相匹配的所有东西(在seleniumtesting不是所有的东西都停止之后)。 这对我工作:
for i in `ps aux | egrep "firefox|chrome|selenium|opera"|grep "/home/dir1/dir2"|awk '{print $2}'|uniq`; do kill -9 $i; done
仅使用awk
(和ps
)的方法:
ps aux | awk '$11" "$12 == "python csp_build.py" { system("kill " $2) }'
通过使用string相等性testing,我防止匹配这个过程本身
我开始使用这样的东西:
kill $(pgrep 'python csp_build.py')
它可以比接受的解决scheme更快地完成。
如果我想杀midori
,例如:
kill -SIGTERM $(pgrep midori)
完成!
杀死我们自己的进程从一个普通的PPID开始是相当频繁的,与–P
标志关联的pkill对我来说是赢家。 使用@ ghostdog74例子:
# sleep 30 & [1] 68849 # sleep 30 & [2] 68879 # sleep 30 & [3] 68897 # sleep 30 & [4] 68900 # pkill -P $$ [1] Terminated sleep 30 [2] Terminated sleep 30 [3]- Terminated sleep 30 [4]+ Terminated sleep 30
你不需要ps的用户开关。
kill `ps ax | grep 'python csp_build.py' | awk '{print $1}'`
给-f给pkill
pkill -f /usr/local/bin/fritzcap.py
.py文件的确切path是
# ps ax | grep fritzcap.py 3076 pts/1 Sl 0:00 python -u /usr/local/bin/fritzcap.py -c -d -m
在某些情况下,我想像这样同时杀死进程:
➜〜睡眠1000& [1] 25410 ➜〜睡眠1000& [2] 25415 ➜〜睡眠1000& [3] 25421 ➜〜睡觉 25421 25415 25410 ➜〜杀死`pidof睡眠` [2] - 25415终止睡眠1000 [1] - 25410终止睡眠1000 [3] + 25421终止睡眠1000
但是,我认为这样做有点不合适(可能是在后台运行python a,python b,python x …)。
我用它来杀死火狐,当它被脚本抨击和cpu bashing :)用你想死的应用程序replace“火狐”。 我在Bash shell – OS X 10.9.3达尔文。
kill -Hup $(ps ux | grep Firefox | awk 'NR == 1 {next} {print $2}' | uniq | sort)
我使用gkill processname
,其中gkill是以下脚本:
cnt=`ps aux|grep $1| grep -v "grep" -c` if [ "$cnt" -gt 0 ] then echo "Found $cnt processes - killing them" ps aux|grep $1| grep -v "grep"| awk '{print $2}'| xargs kill else echo "No processes found" fi
注意:它不会杀死在其命令行中有“grep”的进程。
下面的命令会派上用场:
kill $(ps -elf | grep <process_regex>| awk {'print $4'})
例如, ps -elf | grep top
ps -elf | grep top
0 T ubuntu 6558 6535 0 80 0 - 4001 signal 11:32 pts/1 00:00:00 top 0 S ubuntu 6562 6535 0 80 0 - 2939 pipe_w 11:33 pts/1 00:00:00 grep --color=auto top
kill -$(ps -elf | grep top| awk {'print $4'})
-bash: kill: (6572) - No such process [1]+ Killed top
如果进程仍然卡住,则使用“-9”扩展名进行杀伤,如下所示:
kill -9 $(ps -elf | grep top| awk {'print $4'})
希望有助于…!