題 管道輸出awk殺死-9


我試圖殺死任何與mysql有關的進程。我正在拼湊一個命令,到目前為止,還沒有提出正確的解決方案。另一個考慮因素是,最後一個進程將對應於命令'grep mysql' - 下面命令的一部分。當我嘗試殺死它時,此過程將不再存在,因此需要將其從輸入管道中排除以殺死-9。什麼是完成這項任務的最佳方式?到目前為止,我有一個不完整的命令:

ps -A | grep mysql | awk '{print $1}'

它具有(假的,為了這個例子的目的)輸出

11111
22222
33333  # process id to be excluded

我假設我可以管那xargs kill -9像這樣:

ps -A | grep mysql | awk '{print $1}' | xargs kill -9

並找出一種方法來排除最後一個pid,但我嘗試的一切似乎都無法正常工作。


4
2018-03-15 17:13


起源


永遠不要用mysql殺死-9!請改用kill -15,否則您將面臨破壞數據文件的風險。盡量不要使用kill -9 !! - dAm2K


答案:


這裡最簡單的事情可能就是做 grep 不符合自己的命令:

ps -A | grep [m]ysql | awk '{print $1}' | xargs kill -9

m周圍的括號使它成為一個只包含m的字符集,它不會改變模式但在自身中不會匹配 ps 輸出。這是避免此問題的規範方法。我還想補充說,如果你有 pkill 命令運行 pkill -9 mysql 有點容易。

值得注意的是,你應該盡可能避免使用SIGKILL(-9),因為它不會給目標進程提供優雅退出的機會。如果你還沒有,你應該首先嘗試使用SIGTERM(默認)。


13
2018-03-15 17:23



第一件事:我沒有安裝pkill。這樣做的另一個目的是開始使用awk,因為我對它比較新,這就是為什麼我不只是安裝pkill並使用它。第二件事,是[m] ysql提示按預期工作。我將在未來考慮到這一點。但是,它仍然沒有殺死進程。運行命令後,我沒有輸出任何錯誤,但進程仍在運行。如果我只是經常殺人-9 11111,他們都被成功殺死了。有任何想法嗎? - Charlotte
@Charlotte它應該工作(我以前做過非常相似的命令)。如果手動將它們全部放在一行上,它是否有效?一定要明確地使用外部kill命令(“which kill”來查找它的位置),因為這是xargs將要調用的內容。 - FatalError
好的,效果很好。謝謝 ! - Charlotte
如果您使用的是Linux,那麼您也可以實現與使用不匹配grep相同的目標 ps的 -C 切換到按進程名稱匹配,和 -N 否定比賽。 ps -N -C grep | grep mysql | ... - nitro2k01
對我來說,它在ubuntu 14.04中無法正常工作。我必須將grep之後的模式放在引號內。 - sfotiadis


awk有一個system()命令,允許你直接殺死它...像這樣的東西。

ps ¦awk '/[m]ysql/{system( "kill -9 "$1)}'

方括號的原因與前面的類似。它可以防止awk被殺死並關閉管道。

/ string /將執行類似grep的行匹配。


6
2018-03-16 00:59





為了完整性,我還建議命令 pgrep 和 pkill

  • pgrep [-lf] [-u uid] [-other options] pattern 列出與擴展正則表達式模式匹配的進程
  • pkill [-f] [-t**SIGNAL] pattern 殺死進程匹配模式

如圖所示,最有趣的選擇可能是

  • -f 匹配進程的完整命令行
  • -u user 僅匹配特定用戶進程(也是組...)
  • -l 列出進程名稱/標識符(僅限pgrep)

對於其他人,請參閱精細手冊。

總而言之,這些更加通用和有用(就能夠在你做之前能夠實際檢查你殺死的東西而言)比 killall 或上面發布的更複雜的管道配方。


3
2018-03-16 10:55





要從PID列表中刪除最後一個,您可以使用 頭 - n,其中n是沒有最後一個PID的PID數。

ps -A | grep mysql | awk'{print $ 1}'|頭-n 2 | xargs kill -9

假設你知道將從grep傳輸的PID的數量。


1
2018-03-08 00:35



對於主要問題的副業問題,這是一個可疑質量的答案。 (1)FatalError的答案比我見過的任何其他答案都要好。 (2)你的回答含蓄地支持了OP的有缺陷的概念 grep 本身永遠是最後列出的過程。 (3)用戶似乎不太可能提前知道進程數。 (4)如果你要引用 head -n你應該在某些系統上提到 head -n -1 將輸出除最後一行之外的所有行。 - Scott


或者

killall mysql 

命令可能會為你做。它使用名稱而不是PID。


0
2018-03-15 19:00





kill -9 `ps aux | grep PROCESS_NAME | grep -v grep  |  cut -d' ' -f6`

-2
2017-11-25 13:35



即使問題陳舊,請詳細說明您的單行程如何運作。另外我建議使用 $()而不是反引號。並使用awk而不是切割。並且不要使用 kill -9 除非其他事情都失敗了。 - mveroone