Quero ter certeza de que apenas um script pode ser executado por qualquer usuário regular de um sistema por vez. Pode haver vários usuários conectados e cada um deles só deve ser capaz de executar um comando após a conclusão de qualquer comando em execução de outros usuários.
Há muito tempo, no UNIX, eu estava usando o batch
comando com uma definição de fila "one task only" adequada para serializar a execução de scripts. Resolveu muitos problemas de gerenciamento de bloqueio (precisava apenas de um simples tempo limite para definir os scripts).
Já no Linux o batch
comando executa de forma diferente, uma tarefa é executada a cada minuto, as tarefas são executadas em paralelo até atingir 1,5 de carga média.
Eu fiz minha própria biblioteca de shell de gerenciamento de bloqueio para serializar a execução, mas me pergunto se existe um comando padrão para fazer isso.
flock
é realmente excelente para isso. Você pode usarflock
um wrapper em torno de seu script de shell, usá-lo na linha de comando ou incorporá-lo ao seu próprio script.A melhor coisa
flock
é que, enquanto espera, não espera em um loop ocupado.Também sempre limpa o bloqueio quando seu processo sai /
flock
sai.Os métodos baseados na criação atômica de arquivo/diretório podem ser bloqueados se o processo for encerrado sem limpeza (ou se houver um pânico no kernel ou falha de energia, ...).
Com
flock
, o kernel do Linux faz a limpeza.Do manual,
Neste formulário, você pode agrupar um bloco específico de código em seu script de shell.
Ou você pode executá-lo assim,
Se você não deseja bloquear/esperar indefinidamente, pode especificar um tempo limite:
Ou apenas use um argumento sem bloqueio:
Talvez o que você queira aqui seja um limite rígido do número de processos que seu usuário pode executar? Certifique-se de incluir o processo do shell e quaisquer outras coisas necessárias que precisarão ser executadas durante a sessão.
Isso pode ser definido em /etc/security/limits.conf Adicione uma linha como:
Observe que isso gerará um erro sobre não ser capaz de bifurcar se houver muitas coisas tentando executar ao mesmo tempo. Altere 2 para atender às suas necessidades e 'testuser' para o usuário que deseja limitar.
Use
mkdir
que é um processo atômico para bloquear outros. Apenas um de cada vez pode criar um diretório:Se você executar o script primeiro, ele lerá:
Se alguém tentar executá-lo ao mesmo tempo, a saída será: