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