ローカルおよび同じホストのドッカーコンテナでいくつかのプロセスが実行されています。同じ名前の複数のプロセスを実行するので、ホストで実行されているすべてのプロセスを終了し、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 pid
bash組み込み変数とうまく組み合わせると、$$
現在のシェルの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)を参照してください。