[問題] Debian跟BSD上類似killall5的指令?

看板Linux作者 (一步一腳印)時間12年前 (2011/10/12 05:20), 編輯推噓2(2012)
留言14則, 4人參與, 最新討論串1/1
我偶爾會在SSH遠端伺服器用到killall5這個指令 (killall5的man page摘要: killall5 is the SystemV killall command. It sends a signal to all processes except kernel threads and the processes in its own session, so it won't kill the shell that is running the script it was called from. Its primary (only) use is in the rc scripts found in the /etc/init.d directory.) 我用killall5的目的是砍光"top -u `whoami`"顯示的所有process (使用killall5後同時SSH連線也會斷掉, 不過對我來說沒差) 但killall5這個指令不是每個distro都有(像Debian(wheezy/sid)跟FreeBSD就沒有) 請問該如何用其他指令湊出killall5的功能呢? 我自己亂試了很多種 不過都失敗 例如 killall -u $USER pkill -u $USER (...下略十幾種不同的寫法) 基本上"失敗"的原因都是一樣的 說明如下 假設原本"top -u `whoami`"的process pid清單長這樣: 123 456 789 假設123是SSH連線後得到的shell(bash) 456跟789是我想要砍掉的process 此時若使用killall5 則3個process都會被砍掉 (雖然123也被砍掉了導致我SSH斷線 不過沒差 再SSH過去就好了 重點是456跟789一定要砍乾淨) 然而若用我亂湊的"pkill -u $USER"之類的指令 123被砍掉後SSH會斷線 但456跟789還活著(也就是沒有達到我的要求) 也就是說若遇到遠端伺服器沒有killall5的情況 我就只能top -u $USER然後一個process一個process慢慢砍(k pid signal) (456跟789只是舉例 實際上要砍的process通常都十幾個 打pid會打到手軟) 總結我的問題如下: a) 如何用其他指令湊出跟killall5相同的功能? b) 湊出來的指令要可在Linux及FreeBSD使用 歡迎提供任何想法 感激不盡! -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.31.155

10/12 06:47, , 1F
不知道 kill -9 可不可以?
10/12 06:47, 1F
"kill(all) -9 ..."之類的我試過很多 不過都無效 (不是說SIGNAL不重要啦 只是更重要的應該是指令怎麼寫)

10/12 07:18, , 2F
ps aux|awk '{print $1, $2}'|grep `whoami`|awk '{print
10/12 07:18, 2F

10/12 07:18, , 3F
$2}'|xargs kill -9
10/12 07:18, 3F

10/12 07:20, , 4F
不同*nix系列可能要針對 ps 調整參數以及 awk 印的欄位號
10/12 07:20, 4F

10/12 07:21, , 5F
忘了一件事, 在 xargs 之前要再加上一個 grep -v $$ 才接
10/12 07:21, 5F

10/12 07:21, , 6F
|xargs... (假設是用bash)
10/12 07:21, 6F

10/12 07:22, , 7F
ps aux|awk '{print $1, $2}'|grep `whoami`|awk '{print
10/12 07:22, 7F

10/12 07:22, , 8F
$2}'|grep -v $$|xargs kill -9
10/12 07:22, 8F
剛試了一下發現有用 不過為什麼呢? ......|xargs kill -9 綠色的部份會產生待砍的pid清單 然後pipe給kill砍 這樣跟我本來的作法極為類似 為什麼我的作法不行 這個卻可以呢

10/12 11:41, , 9F
killall -9 -u uid?
10/12 11:41, 9F
-u接的是username唷(另外, 這個也在我的亂試(無效)清單中)

10/12 13:55, , 10F
你從第一個 | 開始,每次增加一個 | ,看執行結果就知道啦
10/12 13:55, 10F
我是這樣試的沒錯 晚點再拿我亂湊的指令產生的pid清單跟這個pid清單比較看看

10/12 18:10, , 11F
最好第一個awk再加上印出start time並印於每列最前,然後再
10/12 18:10, 11F

10/12 18:10, , 12F
加個sort 的 pipe,這樣可以確保比這一串pipes早的程式會先
10/12 18:10, 12F

10/12 18:11, , 13F
被kill到,因為這串pipes程式若比程式更早被kill,就崩潰了
10/12 18:11, 13F
恩恩!

10/13 22:51, , 14F
debian6 在 /sbin/killall5
10/13 22:51, 14F
喔喔..我path沒有/sbin/ 難怪[ -z `which killall5` ]是True... ※ 編輯: Holocaust123 來自: 140.112.31.155 (10/13 23:27)
文章代碼(AID): #1EbBC3_j (Linux)