O problema não é realmente com o cron - é com o seu trabalho.
Você precisará que seu trabalho interaja com um bloqueio de alguma descrição. A maneira mais fácil de fazer isso é tentar criar um diretório e, se for bem-sucedido, continuar, se não sair. Quando seu trabalho terminar e sair, ele deverá remover o diretório pronto para a próxima execução. Aqui está um script para ilustrar.
#!/bin/bash
function cleanup {
echo "Cleanup"
rmdir /tmp/myjob.lck
}
mkdir /tmp/myjob.lck || exit 1
trap cleanup EXIT
echo 'Job Running'
sleep 60
exit 0
Execute isso em um terminal e, antes que os 60 segundos terminem, execute-o em outro terminal e ele sairá com o status 1. Quando o primeiro processo terminar, você poderá executá-lo a partir do segundo terminal ...
EDITAR:
Como acabei de aprender sobre o rebanho, pensei em atualizar esta resposta.
O rebanho (1) pode ser mais fácil de usar. Nesse caso flock -n
, pareceria apropriado, por exemplo
* * * * * /usr/bin/flock -n /tmp/myAppLock.lck /path/to/your/job
Executaria seu trabalho a cada minuto, mas falharia se o rebanho não conseguisse obter um bloqueio no arquivo.