Find and kill a process in one line using bash and regex
我经常需要在编程过程中终止一个进程。
我现在的做法是:
1 2 3 4 | [~]$ 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并在同一行中终止它?
这样地:
1 | [~]$ ps aux | grep 'python csp_build.py' | kill <regex that returns the pid> |
在
1 | kill $(ps aux | grep '[p]ython csp_build.py' | awk '{print $2}') |
其工作细节如下:
ps 为您提供了所有进程的列表。grep 过滤器基于您的搜索字符串,是一个阻止您选择实际 grep 进程本身的技巧。awk 只提供了每行的第二个字段,即pid。$(x) 构造是指执行x 然后获取其输出并将其放到命令行上。上面构造中的ps 管道的输出是进程ID列表,因此您最终得到一个类似于kill 1234 1122 7654 的命令。
这是一份在实际行动中显示它的记录:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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 -v grep 要少一个过程; - 它优雅而鬼鬼祟祟,是一种罕见的组合——)
如果你有pkill,
1 | pkill -f csp_build.py |
如果您只想对进程名(而不是完整的参数列表)进行grep,那么就不要使用
一班轮:
- 打印列2:
awk '{print $2}' 。 sudo 是可选的- 运行
kill -9 5124 ,kill -9 5373 等(kill-15更优雅,但稍慢)
奖金:
我的.bash_配置文件中还定义了两个快捷函数(~/.bash_profile是针对OSX的,您必须查看什么适用于您的*nix机器)。
- 列出包含关键字的所有进程
- 用途如:
p csp_build 、p python 等
Bash_配置文件代码:
1 2 3 4 | # 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_配置文件代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | # 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" Searching for '$1' -- Found" $cnt"Running Processes .." p $1 echo -e ' Terminating' $cnt 'processes .. ' ps aux | grep -i $1 | grep -v grep | awk '{print $2}' | xargs sudo kill -klevel echo -e"Done! " echo"Running search again:" p"$1" echo -e" " } |
试用使用
1 | ps aux | grep 'python csp_build.py' | head -1 | cut -d"" -f 2 | xargs kill |
1 2 3 | killall -r regexp -r, --regexp |
将进程名模式解释为扩展正则表达式。
您只能使用
如果你想在杀死之前看到你要杀死或发现什么,只需使用
使用PGrep-可在许多平台上使用:
1 | kill -9 `pgrep -f cps_build` |
pgrep-f将返回所有符合"cps_build"的pid。
通过关键字
你可以用awk和backtics来做
1 | ps auxf |grep 'python csp_build.py'|`awk '{ print"kill" $2 }'` |
awk中的$2打印第2列,backtics运行打印的语句。
但是对于python进程来说,一个更干净的解决方案是将其进程ID存储在/var/run中,然后您可以简单地读取该文件并杀死它。
我的任务是杀死所有与放在特定目录中的regexp匹配的东西(在Selenium测试之后,并不是所有东西都停止了)。这对我很有用:
1 | for i in `ps aux | egrep"firefox|chrome|selenium|opera"|grep"/home/dir1/dir2"|awk '{print $2}'|uniq`; do kill $i; done |
仅使用
1 | ps aux | awk '$11""$12 =="python csp_build.py" { system("kill" $2) }' |
通过使用字符串相等性测试,我将阻止匹配此进程本身。
1 | ps -o uid,pid,cmd|awk '{if($1=="username" && $3=="your command") print $2}'|xargs kill -15 |
把-f给pkill
1 | pkill -f /usr/local/bin/fritzcap.py |
.py文件的确切路径是
1 2 | # ps ax | grep fritzcap.py 3076 pts/1 Sl 0:00 python -u /usr/local/bin/fritzcap.py -c -d -m |
我开始用这样的东西:
1 | kill $(pgrep 'python csp_build.py') |
杀戮我们自己的过程从一个普通的PPID开始是相当频繁的,与
1 2 3 4 5 6 7 8 9 10 11 12 13 | # 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的用户开关。
1 | kill `ps ax | grep 'python csp_build.py' | awk '{print $1}'` |
在某些情况下,我希望以这种方式同时终止进程:
1 2 3 4 5 6 7 8 9 10 11 12 | ? ~ sleep 1000 & [1] 25410 ? ~ sleep 1000 & [2] 25415 ? ~ sleep 1000 & [3] 25421 ? ~ pidof sleep 25421 25415 25410 ? ~ kill `pidof sleep` [2] - 25415 terminated sleep 1000 [1] - 25410 terminated sleep 1000 [3] + 25421 terminated sleep 1000 |
但是,我认为这在您的情况下有点不合适(可能在后台运行的是python a、python b、python x…)。
这将只返回PID
1 | pgrep -f 'process_name' |
因此,要杀死一行中的任何进程:
1 | kill -9 $(pgrep -f 'process_name') |
或者,如果您知道进程的确切名称,也可以尝试pidof:
1 | kill -9 $(pidof 'process_name') |
但是,如果你不知道进程的确切名称,那么
如果有多个进程以相同的名称运行,并且您希望杀死第一个进程,那么:
1 | kill -9 $(pgrep -f 'process_name' | head -1) |
另外要注意的是,如果您担心区分大小写,那么您可以像grep中那样添加-i选项。例如:
1 | kill -9 $(pgrep -fi chrome) |
关于
我使用
1 2 3 4 5 6 7 8 | 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"的进程。
我用这个来杀死firefox,当它被脚本猛击和CPU攻击时:)将"firefox"替换为你想死的应用程序。我在Bash Shell上—OS X 10.9.3达尔文。
以下命令将派上用场:
如。,
1 2 | 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 |
1 2 | -bash: kill: (6572) - No such process [1]+ Killed top |
如果该过程仍被卡住,则使用"-9"扩展到Hardkill,如下所示:
希望能有帮助…!
在bash的一行中查找并杀死所有进程。
1 | kill -9 $(ps -ef | grep '<exe_name>' | grep -v 'grep' | awk {'print $2'}) |
ps -ef | grep ' —提供与模式匹配的运行进程详细信息(uname、pid等)列表。输出列表还包括搜索它的' grep 命令。现在,为了杀戮,我们需要忽略这个grep 命令过程。ps -ef | grep ' —在' | grep -v 'grep' -v 'grep' 中添加另一个grep将删除当前grep过程。- 然后使用
awk 单独获取进程ID。 - 然后把这个命令保存在
$(...) 中,传递给kill 命令,杀死所有进程。
可以使用下面的命令列出命令的PID。使用top或更好的方法使用htop查看Linux中的所有进程。在这里我想杀死一个名为
1 | ps -ef | grep '/usr/lib/something somelocation/some_process.js' | grep -v grep | awk '{print $2}' |
并验证PID。必须是正确的。要杀死他们,使用kill命令。
1 | sudo kill -9 `ps -ef | grep '/usr/lib/something somelocation/some_process.js' | grep -v grep | awk '{print $2}'` |
例如:来自HTOP进程列表。
1 | sudo kill -9 `ps -ef | grep '<process>' | grep -v grep | awk '{print $2}'` |
这解决了我的问题。如果意外地终止了进程,请始终准备重新启动进程。