Como posso matar processos por nome específico e excluir processos raiz

3

Não há muito tempo, descobrimos pkill e tínhamos em mente começar a usá-lo em um script setuid (para root) para limpeza global de processos. Isso pode nos poupar de muita manutenção estúpida, onde alguns clientes não podem remover recursos gerais usando seus scripts apenas devido a limitações importantes de permissão.

No entanto, depois de algumas dificuldades, só obtivemos pkill -v -u root <name> (até agora tentamos simplificá-lo e evitamos passar para um script longo e feio com sed , awk , grep e assim por diante ). É claro que não funciona - apenas mata tudo, menos os processos que correspondem ao nome dado.

Existe alguma versão modificada do comando pkill que nos fornece os resultados de que precisamos?

P.S: Eu quero evitar qualquer discussão sobre a moralidade de dar algum tipo de poder aos usuários.

O sistema operacional em execução é o Solaris 10, se isso for importante.

    
por Aviv 02.03.2016 / 21:22

2 respostas

2

Isto irá gerar uma lista de processos com o nome dado, e uma lista de processos com o nome dado rodando como root, então execute comm para encontrar processos na primeira lista que não estão na segunda lista, então mate eles.

#!/bin/ksh
if test $# != 1
then
    echo usage: "$0" processname
    exit 1
fi
pname="$1"
kill $(comm -23 <(pgrep "$pname"|sort -n) <(pgrep -u root "$pname"|sort -n))
    
por 02.03.2016 / 23:40
1

Estou usando o SUSE, mas assumindo que funciona de maneira semelhante no Solaris.

Processo de eliminação para um usuário

Para matar um processo pelo seu ID de usuário, você pode fazer o seguinte

#pkill -U <username>

Verificar processos para um usuário

Se você quiser apenas verificar quais processos estão sendo executados para um usuário em particular antes de eliminar seus processos, você pode usar: pgrep -U <username

Processo de eliminação para vários usuários

#pkill -U <user1>,<user2>,<user3> e assim por diante.

Mate todos os usuários, exceto o root

Eu sei que você está evitando sed, awk, grep. Mas é mais fácil escrever um script em vez de digitar cada nome de usuário. Aqui está uma amostra. Por favor verifique no sanbox antes de executar em produção.

ps -aef |grep -v UID |grep -v root |awk '{print $1}' 
 |sort -u |while read name
do 
echo "Killing process for user $name"
pkill -U $name
done
    
por 02.03.2016 / 21:51