usando flock com cron

2

Eu preciso evitar que um script seja executado várias vezes simultaneamente e, assim, flock parece ser a minha rua.

O que não consigo descobrir é se preciso excluir manualmente o arquivo de bloqueio após a conclusão da tarefa do cron?

Estou usando assim:

# m h dom mon dow user  command
*/20 *  *  *  *  root /usr/bin/flock -w 0 /var/cron.lock /usr/bin/myscript

Este script também é executado na inicialização da máquina por upstart (é onde a condição de corrida é).

O arquivo é criado ok, mas não consigo ver como o comando sabe se o bloqueio está sendo mantido por outro processo. Está vazio e monitorá-lo para alterações quando a tarefa cron é desativada não produz nada (usando fuser ).

Se alguém puder explicar como funciona, ficarei muito agradecido!

    
por James 13.01.2016 / 23:33

2 respostas

7

O arquivo de bloqueio especificado como a opção para /usr/bin/flock ; /var/cron.lock permanece bloqueado com a flock(2) chamada do sistema pela duração do seu script /usr/bin/myscript . Quando o script for concluído, o bloqueio será liberado novamente por /usr/bin/flock .

Quando o comando /usr/bin/flock não puder obter um bloqueio, ou seja, porque /var/cron.lock já está bloqueado porque seu script ainda está em execução (ou qualquer outra condição de erro), o / usr / bin / flock não executará seu roteiro. Seu script não precisa ser modificado e não precisa fazer nenhuma verificação do bloqueio, isso é feito por / usr / bin / flock.

O próprio arquivo de bloqueio será criado como um arquivo vazio pelo comando /usr/bin/flock se ele ainda não existir, mas depois que ele for criado o arquivo de bloqueio não será alterado, apenas um lote (2) será aplicado e removido. O arquivo não será removido depois que o script for concluído.

    
por 14.01.2016 / 00:41
1

Existe uma razão pela qual você não pode fazer algo como:

# m h dom mon dow user  command
*/20 *  *  *  *  root (/usr/bin/pgrep myscript || /usr/bin/myscript)

Se o processo não puder ser encontrado na tabela de instantâneos atual do processo, ele retornará 1 e executará /usr/bin/myscript .

Se o processo puder ser encontrado na tabela de instantâneos atual do processo, ele retornará 0 e parará a execução.

    
por 14.01.2016 / 00:53

Tags