Process
過濾掉並殺死非 docker 程序
我有一些程序在本地和同一主機上的 docker 容器中執行。由於我執行多個同名程序,我想創建一個別名/函式,允許我殺死所有在主機上執行的程序,但忽略在 docker 中執行的程序。
我現在使用的命令具有這種形式:
kill $(ps aux | grep 'process_name' | awk '{print $2}')
我注意到這個命令會殺死所有正在執行的容器中具有相同名稱的程序,這會使它們崩潰。我怎樣才能防止這種情況?
這是主機上的程序的樣子(作為 ps aux 的結果):
hamzam 9109 0.9 0.0 510912 24732 ? Ssl 14:21 0:00 python /opt/scripts/ex_script __name:=process_name __log:=/home/hamzam/.logs/0286c734-71fd-11e7-9dc4-901b0ed728a7/process_name-3.log
這是在其中一個容器中執行的過程:
hamzam 12168 2.3 0.0 472708 64312 ? Ssl 14:22 0:00 python /opt/scripts/ex_script __name:=process_name __log:=/home/logs/0/126e36dc-71fd-11e7-bd98-0242ac110003/process_name-3.log
pkill
has--ns pid
和--nslist name...
options 可用於限制 kill 將影響的命名空間。與
--ns pid
bash 內置變數 結合得很好$$
,它等於目前 shell 的 PID。例如,在我的一個系統上,我在 docker 中執行了一個 gitlab 實例,它在該容器中執行的服務之一是 redis:
# ps u -C redis-server USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND 997 30006 0.1 0.0 35504 2896 ? Ssl 16:05 0:00 /opt/gitlab/embedded/bin/redis-server 127.0.0.1:0
注意 PID,30006。
如果我使用 pkill 的
-ns $$
選項,那麼它不會被殺死,因為它與我的 shell 位於不同的命名空間中。注意 PID 沒有改變——這表明它沒有被殺死並重新啟動。# pkill --ns $$ redis-server # ps u -C redis-server USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND 997 30006 0.1 0.0 35504 2896 ? Ssl 16:05 0:00 /opt/gitlab/embedded/bin/redis-server 127.0.0.1:0
如果我不使用該選項,那麼(不出所料)它將被殺死。
# pkill redis-server # ps u -C redis-server USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND 997 459 0.5 0.0 35504 2896 ? Ssl 16:11 0:00 /opt/gitlab/embedded/bin/redis-server 127.0.0.1:0
redis-server 的 PID 現在是 459。它已經被殺死並重新啟動。
順便說一句,
pgrep
支持相同的選項,因此很容易獲得相同命名空間中其他程序的列表。例如pgrep -a --ns 459
,向我展示了與上面的 redis-server 在同一命名空間中執行的所有程序。
ps
還具有用於顯示命名空間詳細資訊的各種輸出格式選項。例如:# ps -o pidns,pid,cmd -C redis-server PIDNS PID CMD 4026532661 459 /opt/gitlab/embedded/bin/redis-server 127.0.0.1:0
來自
man ps
:pidns PIDDNS
描述程序所屬命名空間的唯一 inode 編號。請參閱命名空間 (7)。