O PAM é usado para autorizar logins e modificações na conta. Não é de todo relevante restringir um programa específico.
A única maneira de aplicar um limite ao número de vezes que um programa pode ser executado é invocá-lo por meio de um wrapper que aplique esse limite. Os usuários podem, obviamente, ignorar esse wrapper, tendo sua própria cópia do programa; se você não quiser, não dê conta aos usuários em sua máquina.
Para restringir um programa a uma única instância, você pode fazer um bloqueio exclusivo em um arquivo. Não existe uma maneira simples de usar um arquivo para permitir um número limitado de instâncias, mas você pode usar 5 arquivos para permitir 5 instâncias e fazer o script de wrapper tentar cada arquivo separadamente. Crie um diretório /var/lib/myapp/instances
(ou onde quer que você queira colocá-lo) e crie 5 arquivos nele, todos legíveis, mas somente graváveis pelo root.
umask 022
mkdir /var/lib/myapp
touch /var/lib/myapp/instances/{1,2,3,4,5}
Wrapper script (substitua myapp.original
pelo caminho do executável original), usando o % do Linux utilitárioflock
:
#!/bin/sh
for instance in /var/lib/myapp/instances; do
flock -w 0 -E 128 "$instance" myapp.original "$@"
ret=$?
if [ "$ret" -ne 128 ]; then exit "$ret"; fi
done
echo >&2 "Maximum number of instances of myapp reached."
exit 128