Como faço para matar todos os processos de um usuário usando seu UID

33

Eu quero matar todos os processos em execução de um usuário em particular a partir de um script de shell ou código nativo em um sistema Linux.

Eu tenho que ler o diretório / proc e procurar por eles?

Alguma ideia? Existe um mapeamento dinâmico dos pids em UIDs no Linux? Não é isso no proc?

Se não, então onde esta lista é mantida? Eu deveria ler isso? Além disso, onde está a lista estática de todos os UIDs no sistema para que eu possa validar este usuário e, em seguida, continuar a matar todos os processos em execução?

    
por user489152 04.08.2011 / 12:06

5 respostas

40

Use pkill -U UID ou pkill -u UID ou nome de usuário em vez de UID. Às vezes, skill -u USERNAME pode funcionar, outra ferramenta é killall -u USERNAME .

A habilidade era específica do Linux e agora está desatualizada, e pkill é mais portátil (Linux, Solaris, BSD).

O pkill permite UIDs numéricos e simbólicos, um link eficaz e real >

pkill - ... signal processes based on name and other attributes

    -u, --euid euid,...
         Only match processes whose effective user ID is listed.
         Either the numerical or symbolical value may be used.
    -U, --uid uid,...
         Only match processes whose real user ID is listed.  Either the
         numerical or symbolical value may be used.

A página de habilidades do Man diz que é permitido usar apenas o nome de usuário, não o ID do usuário: link

skill, snice ... These tools are obsolete and unportable. The command syntax is poorly defined. Consider using the killall, pkill

  -u, --user user
         The next expression is a username.

O killall não está marcado como desatualizado no Linux, mas também não funciona com o UID numérico; apenas nome de usuário: link

killall - kill processes by name

   -u, --user
         Kill only processes the specified user owns.  Command names
         are optional.

Eu acho que qualquer utilitário usado para encontrar processos no estilo Linux / Solaris / proc (procfs) usará lista completa de processos (fazendo algum readdir de /proc ). Eu acho que eles irão iterar sobre /proc subpastas digitais e verificar todos os processos encontrados para correspondência.

Para obter uma lista de usuários, use getpwent (receberá um usuário por chamada).

habilidade (procps & procps-ng) e killall (psmisc) usam ambos getpwnam chamada da biblioteca para analisar o argumento da opção -u , e apenas o nome de usuário será analisado. pkill (procps & procps-ng) usa o atol e o getpwnam para analisar o argumento -u / -U e permitir o especificador de usuário numérico e textual.

    
por 04.08.2011 / 12:07
8

Se você passar -1 como o argumento do ID do processo para o kill comando shell ou a % funçãokill C , então o sinal é enviado para todos os processos que pode alcance, o que na prática significa todos os processos do usuário executando o comando kill ou syscall.

su -c 'kill -TERM -1' bob

Em C (verificação de erros omitida):

if (fork() == 0) {
    setuid(uid);
    signal(SIGTERM, SIG_DFL);
    kill(-1, SIGTERM);
}
    
por 04.08.2011 / 19:01
2

Se a função pkill não estiver disponível em sua distribuição UNIX / Linux, você poderá executar o seguinte comando como o usuário root:

ps -ef | grep username | grep -v grep | awk '{print $2}' | xargs kill

em que nome de usuário é o usuário cujos processos você deseja excluir

    
por 04.08.2011 / 13:00
2
pgrep -U username|xargs kill -9
    
por 18.07.2016 / 19:42
0

Isso funcionou muito bem para mim. Você pode encontrar todos os pid's dos processos por nome de usuário fazendo ps U <username> e de lá ir. Tente isto:

ps U <username> | cut -d " " -f 1 | xargs kill
    
por 05.12.2014 / 21:55

Tags