Filtre e elimine processos não-docker

1

Eu tenho alguns processos que estou executando tanto localmente quanto dentro de contêineres do docker no mesmo host. Como executo vários processos com o mesmo nome, gostaria de criar um alias / função que me permitisse eliminar todos os que estão em execução no host, mas ignorar aqueles que estão sendo executados no docker.

O comando que estou usando agora tem este formulário:

kill $(ps aux | grep 'process_name' | awk '{print $2}')

Percebi que esse comando mata os processos com o mesmo nome em todos os contêineres em execução, o que os faz falhar. Como posso evitar isso?

É assim que o processo na máquina host se parece (como resultado de 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

E este é o processo que é executado em um dos contêineres:

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
    
por hamzam 26.07.2017 / 14:04

1 resposta

1

pkill tem --ns pid e --nslist name... opções que podem ser usadas para restringir quais namespaces o kill afetará.

O --ns pid combina bem com a variável incorporada do bash $$ , que é igual ao PID do shell atual.

Por exemplo, em um dos meus sistemas, executo uma instância do gitlab no docker e um dos serviços que ele executa nesse contêiner é 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

Observe o PID, 30006.

Se eu usar a opção -ns $$ do pkill, ela não será kill porque está em um namespace diferente do meu shell. Observe como o PID não mudou - isso indica que ele não foi morto e reiniciado.

# 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

Se eu não usar essa opção, então (sem surpresa) ela será eliminada.

# 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

O PID do redis-server agora é 459. Ele foi morto e reiniciado.

BTW, pgrep suporta as mesmas opções, por isso é fácil obter uma lista de outros processos nos mesmos namespaces. por exemplo. pgrep -a --ns 459 mostra todos os processos em execução no mesmo namespace que o servidor de redis acima.

ps também possui várias opções de formato de saída para exibir detalhes do espaço de nomes. Por exemplo:

# ps -o pidns,pid,cmd -C redis-server
     PIDNS   PID CMD
4026532661   459 /opt/gitlab/embedded/bin/redis-server 127.0.0.1:0

De man ps :

pidns PIDNS

Unique inode number describing the namespace the process belongs to. See namespaces(7).

    
por 27.07.2017 / 08:22