使用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的grepfilter, [p]是一个伎俩,阻止你拿起实际的grep进程本身。
  • awk只是给你每行的第二个字段,即PID。
  • $(x)构造意味着执行x然后将其输出放在命令行上。 上面那个构造里面的那个pspipe道的输出是进程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 3600grep 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 grepless了一个过程 | 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 5124kill -9 5373等(杀-15更优雅,但稍慢)

奖金:

我也在我的.bash_profile中定义了2个快捷方式函数(〜/ .bash_profile用于osx,你必须看看你的* nix机器有什么作用)。

  1. p 关键字
    • 列出包含关键字的所有P进程
    • 用法例如: p csp_buildp python

bash_profile代码:

 # FIND PROCESS function p(){ ps aux | grep -i $1 | grep -v grep } 
  1. ka 关键字
    • K ills会有这个关键字的进程
    • 用法如: ka csp_buildka python
    • 可选的杀死级别,例如: ka csp_build 15ka 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'})

希望有助于…!