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

ベストアンサー1

pkillシャットダウンが影響を与える名前空間を制限するために使用できるオプションが--ns pidあります。--nslist name...

--ns pidbash組み込み変数とうまく組み合わせると、$$現在のシェルのPIDと同じです。

たとえば、私のシステムの1つでdockerでgitlabインスタンスを実行し、そのコンテナで実行されているサービスの1つが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 $$私のシェルとは異なる名前空間にあるため、pkillは終了しません。 PIDは変更されていません。これは、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 PIDNS

プロセスが属する名前空間の一意の inode 番号を記述します。名前空間(7)を参照してください。

おすすめ記事