Permitir uma entrada de cada vez no trabalho de incron?

1

Eu tenho um diretório para monitorar. Quando é atualizado, eu corro algum comando via incron. Quando vários arquivos são copiados nesse diretório, o incron executa vários comandos ao mesmo tempo. Existe alguma maneira que quando um trabalho de incron está em execução, o segundo trabalho não deve ser executado ?. Eu segui este tutorial para orientação.

    
por Shafiq 17.02.2016 / 11:48

2 respostas

1

Não, o incron não tem um recurso de bloqueio embutido. Se você quiser impedir que os trabalhos sejam executados ao mesmo tempo, faça-o de dentro do trabalho.

Se você quiser atrasar um trabalho até que o (s) último (s) anterior (es) tenha terminado, faça com que eles fechem. Você pode usar o comando flock . Existem exemplos na página man.

Se você quiser pular um trabalho se o anterior não tiver terminado, ainda poderá usar flock , mas com um tempo limite de 0. Se não conseguir obter o bloqueio, saia. Observe que isso é propenso a uma condição de corrida: pode acontecer que um novo arquivo seja copiado logo após o tempo em que o trabalho # 1 terminou de enumerar os arquivos, mas antes de ter tempo de liberar o bloqueio, e o trabalho 2 veria que o bloqueio é ainda mantido e sair sem processar o arquivo também. Não há maneira fácil de resolver essa raça.

    
por 18.02.2016 / 02:12
0

Um exemplo de solução mais simples: suponha que 1 signifique que o arquivo está bloqueado (o script anterior já está em execução) e 0 significa desbloqueado (nenhum processo em execução).

Então aqui está o código

    state='cat /tmp/my_lck'
    if [ "$state" -eq 1 ];then
        echo "Already executing!!!"
        exit
    else
        #Lock the file
        echo 1 > /tmp/nws_lck

       #Put you code here  

 #Unlock    
        echo 0 > /tmp/nws_lck

    fi
    
por 18.02.2016 / 05:35