Eu quero matar todos os processos em execução de um usuário específico a partir de um script de shell ou código nativo em um sistema Linux.
Preciso ler o diretório / proc e procurar por eles?
Alguma ideia? Existe um mapeamento dinâmico dos pids em UIDs no Linux? Isso não está no processo?
Caso contrário, onde essa lista é mantida? Devo ler sobre isso? Além disso, onde está a lista estática de todos os UIDs no sistema, para que eu possa validar essa existência desse usuário e continuar matando todos os processos em execução sob ele?
setuid()
escolher.Respostas:
Use
pkill -U UID
oupkill -u UID
ou nome de usuário em vez de UID. Às vezesskill -u USERNAME
pode funcionar, outra ferramenta ékillall -u USERNAME
.O Skill era específico do Linux e agora está desatualizado, e o pkill é mais portátil (Linux, Solaris, BSD).
O pkill permite UIDs numéricos e simbólicos, efetivos e reais http://man7.org/linux/man-pages/man1/pkill.1.html
A página de manual de habilidade diz que é permitido usar apenas o nome de usuário, não o ID do usuário: http://man7.org/linux/man-pages/man1/skill.1.html
O killall não está marcado como desatualizado no Linux, mas também não funcionará com UID numérico; único nome de usuário: http://man7.org/linux/man-pages/man1/killall.1.html
Eu acho que qualquer utilitário usado para encontrar processos no estilo Linux / Solaris / proc (procfs) usará a lista completa de processos (fazendo alguns readdir de
/proc
). Eu acho que eles irão percorrer/proc
subpastas digitais e verificar todos os processos encontrados quanto à correspondência.Para obter a lista de usuários, use
getpwent
(ele receberá um usuário por chamada).As ferramentas skill (procps & procps-ng) e killall (psmisc) usam a
getpwnam
chamada de biblioteca para analisar o argumento da-u
opção e apenas o nome de usuário será analisado.pkill
(procps & procps-ng) usa atol e getpwnam para analisar-u
/-U
argumentar e permitir o especificador de usuário numérico e textual.fonte
killall -u USERNAME
funcionou como encantoSe você passar -1 como argumento do ID do processo para o
kill
comando shell ou para akill
função C , o sinal será enviado para todos os processos que ele puder alcançar, o que, na prática, significa todos os processos do usuário executando okill
comando ou syscall.Em C (verificação de erro omitida):
fonte
Se a função pkill não estiver disponível na sua distribuição UNIX / Linux, você poderá executar o seguinte comando como usuário root:
onde username é o usuário que processa você deseja excluir
fonte
pkill -U username
.fonte
Isso funcionou muito bem para mim. Você pode encontrar todos os detalhes dos processos por nome de usuário, fazendo
ps U <username>
e indo a partir daí. Tente o seguinte:fonte