Use flock(1)
:
NAME
flock - manage locks from shell scripts
SYNOPSIS
flock [options] <file> -c <command>
flock [options] <directory> -c <command>
flock [options] <file descriptor number>
[...]
Você pode bloqueá-lo ou sair imediatamente. A pré-existência (ou ausência) do arquivo de bloqueio não faz diferença. Ele cria o arquivo, se necessário, e usa uma chamada de sistema flock()
para bloquear o arquivo. Este bloqueio é liberado automaticamente na morte do processo.
Por exemplo, no cron:
*/5 * * * * /usr/bin/flock /tmp/my.lock /usr/local/bin/myjob
Se os seus trabalhos nem sempre terminarem em 5 minutos, você pode considerar usar --timeout
para que seus trabalhos não fiquem em fila:
flock --timeout=300
Ou use --nonblock
para sair imediatamente - seria semelhante a --timeout=0
Se o seu script é um shell script, você pode usar alguns truques inteligentes de redirecionamento para usar o flock dentro do próprio script:
(
flock -n 9 || exit 1
# ... commands executed under lock ...
) 9>/var/lock/mylockfile
Ou, o manual também sugere tornar seu script recursivo, colocando isso no topo (ele usa o próprio script como arquivo de bloqueio):
[ "${FLOCKER}" != "$0" ] && exec env FLOCKER="$0" flock -en "$0" "$0" "$@" || :
Veja a página flock(1)
man para mais informações