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/fooa/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.