Process

過濾掉並殺死非 docker 程序

  • July 27, 2017

我有一些程序在本地和同一主機上的 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

pkillhas--ns pid--nslist name...options 可用於限制 kill 將影響的命名空間。

--ns pidbash 內置變數 結合得很好$$,它等於目前 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)。

引用自:https://unix.stackexchange.com/questions/381887