Este é um Problema XY clássico - você está tentando limitar o número de instâncias de softwares licenciados sendo executados por usuário, mas você está focado na limitação de logins de shell. Este é o problema errado para resolver.
Uma solução melhor é:
-
Renomeie o programa, por exemplo de
/usr/local/bin/foo
a/usr/local/bin/foo.real
-
Escreva um script de 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 o problema de licenciamento e não se importam de seguir as regras. Isso não impedirá que um usuário sorrateiro execute foo.real
. Você pode parar usuários furtivos, mas não muito inteligentes, adicionando alias foo.real=foo
a /etc/profile
ou /etc/bash.bashrc
.
Você poderia executar uma tarefa cron do root que detectasse instâncias de foo.real
em execução que não tivessem um script de shell chamado foo
como o processo pai. O cron job poderia matar qualquer uma dessas instâncias e / ou enviá-lo por e-mail (para evitar spam, controle os IDs do processo para foo.real e não envie vários avisos sobre o mesmo PID).
BTW, se 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.