關鍵字殺進程

不做運維,linux基礎還真不如運維同學犀利,再次受教了,總結一下

背景

經常多進程部署服務,restart, stop時需要根據關鍵字搜索出這一組進程,殺掉
比如:python dir/tcp_server.py &多次執行起了多個進程,現在希望搜索dir/tcp_server.py 殺掉這組進程

CUT

ps -ef | grep dir/tcp_server.py | grep -v grep | cut -c 9-15 | xargs kill -9
首先是基礎的ps -ef | grep XXX,搜索出XXX的進程信息,結果如下:

xxxxxxx    6014      1  0 Nov30 ?        02:26:01 python2.7 dir/tcpserver.py 51014
xxxxxxx    6015      1  0 Nov30 ?        02:22:52 python2.7 dir/tcpserver.py 51015
xxxxxxx    6016      1  0 Nov30 ?        02:26:52 python2.7 dir/tcpserver.py 51016
xxxxxxx    6017      1  0 Nov30 ?        03:56:13 python2.7 dir/tcpserver.py 51017
xxxxxxx    6018      1  0 Nov30 ?        02:24:23 python2.7 dir/tcpserver.py 51018
xxxxxxx    6019      1  0 Nov30 ?        02:31:03 python2.7 dir/tcpserver.py 51019
6342     106660 106495  0 14:08 pts/5    00:00:00 grep dir/tcp_server.py
大傢伙都能發現,結果包含grep進程自身,顯然要排除出去,所以再次grep -v grep ,這樣就只剩下希望被殺的那些進程了
接着是cut,截取9-15字符,剛好就是進程號,結果如下:
   6014
   6015
   6016
   6017
   6018
   6019
最後,通過xargs傳遞給kill -9去殺死

AWK

cut適應性不給力,比如Mac就不能按9-15切割,那能不能智能一點點,就要獲取進程號那一列.答案是 awk

ps aux | grep dir/tcp_server.py | grep -v grep | awk '{print $2}'| xargs kill -9

grep []

grep -v總讓人感覺很蛋疼,能不能不要包含grep自身呢?答案是 grep []

ps aux | grep [d]ir/tcp_server.py | awk '{print $2}' | xargs kill -9

  • 注意: grep [d]ir/tcp_server.py 一句中的中括號

pgrep

關鍵字搜索一組進程,這麼高頻的實用的功能,爲啥不先問問Linux自帶有沒有更好的呢?答案是 pgrep

pgrep -f dir/tcp_server.py | xargs kill -9

  • pgrep 默認只能匹配進程的前15個字符串,所以默認使用,你很可能搜索不到進程號
  • pgrep -f 可以進行進程全字符匹配
    所以,上面的命令帶了-f參數

pkill

pgrep都這麼便利了,xargs能不能也被"便利"一下呢? 答案是pkill

pkill -f dir/tcp_server.py

  • -f參數同pgrep
  • pkill和killall的區別:killall需要的是全名, pkill只要部分名字就可以

pgrep pkill更多詳細命令參數,看官們就各自查閱吧

發佈了72 篇原創文章 · 獲贊 54 · 訪問量 38萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章