Отфильтровывать и убивать не-докерные процессы

У меня есть некоторые процессы, которые я запускаю как локально, так и в контейнерах докеров на одном хосте. Поскольку я запускаю несколько процессов с тем же именем, я хотел бы создать псевдоним / функцию, которая позволила бы мне убить всех из них, работающих на узле, но игнорировать те, которые работают в докере.

Команда, которую я сейчас использую, имеет следующую форму:

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 есть параметры --ns pid и --nslist name... , которые могут использоваться для ограничения того, на какие пространства имен повлияет kill.

Параметр --ns pid хорошо сочетается с встроенной переменной bash $$ , которая равна PID текущей оболочки.

Например, в одной из моих систем я запускаю экземпляр 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.

Если я использую параметр -ns $$ , то он не будет убивать, потому что он находится в другом пространстве имен для моей оболочки. Обратите внимание, что 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 

PID redis-сервера теперь 459. Он был убит и перезапущен.

BTW, pgrep поддерживает одни и те же параметры, поэтому легко получить список других процессов в тех же пространствах имен. например, pgrep -a --ns 459 показывает мне все процессы, работающие в том же пространстве имен, что и redis-сервер выше.


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).