
Preciso saber como eliminar todos os processos de um usuário logado, exceto o primeiro no linux redhat 6.
por exemplo, AZain
o usuário está logado várias vezes em máquinas diferentes, então preciso permitir apenas o primeiro processo e eliminar todos os outros para este usuário:
who -u
AZain pts/2 2016-06-23 08:34 . 27191 (localhost)
AZain pts/4 2016-06-23 09:01 . 28885 (localhost)
root pts/0 2016-06-23 08:14 . 25962 (10.11.155.23)
AZain pts/1 2016-06-23 08:34 00:27 27169 (10.11.155.23)
AZain pts/3 2016-06-23 09:01 . 28867 (10.11.155.14)
Editar: estou tentando fazer isso porque tenho um aplicativo que consome licenças para usuários. Assim, cada nova sessão para o mesmo usuário consumiria mais licença. Se eu pudesse impedir novos logins para o mesmo usuário, seria ótimo.
Responder1
Este é um clássicoProblema XY- você está tentando limitar o número de instâncias de software licenciado em execução por usuário, mas está focado em limitar logins de shell. Este é o problema errado para resolver.
Uma solução melhor é:
Renomeie o programa, por exemplo, de
/usr/local/bin/foo
para/usr/local/bin/foo.real
Escreva um script wrapper com o mesmo nome e caminho do programa original (por exemplo,
/usr/local/bin/foo
) para verificar se o usuário já o está executando.Se sim, saia com uma mensagem de erro apropriada. Caso contrário, execute o programa original (
/usr/local/bin/foo.real
)
Um exemplo muito simples:
#! /bin/sh
if pgrep -u "$USER" foo.real >/dev/null 2>&1 ; then
echo "You are already running foo" >&2
exit 1
else
foo.real
fi
Observação: isso funciona para usuários bem comportados que entendem a questão do licenciamento e não se importam em seguir as regras. Isso não impedirá que um usuário sorrateiro foo.real
se execute. Você pode impedir usuários sorrateiros, mas não muito inteligentes, alias foo.real=foo
adicionando /etc/profile
ou /etc/bash.bashrc
.
Você pode executar um cron job raiz que detectou instâncias em foo.real
execução que não tinham um script de shell chamado foo
como processo pai. O cron job pode eliminar essas instâncias e/ou enviar um aviso por e-mail (para evitar spam, acompanhe os IDs do processo para foo.real e não envie vários avisos sobre o mesmo PID).
Aliás, se o seu software licenciado vier com algum tipo de gerenciador de licenças, verifique sua documentação para ver se ele pode restringir o número de instâncias por usuário.