
Eu tenho o seguinte código no meu root
crontab no meu Debian
* * * * * flock -xn /absolute/path/to/run.lock -c cd /absolute/parth/to/project && ./run >> run.log
Mas não vejo run.log
nenhum run.lock
arquivo onde os especifico. Na verdade, não há evidências de que o script tenha sido executado.
Executar ps aux | grep run
apenas produz essa grep
chamada.
Como executo o run
script usando flock
na raiz crontab
?
Responder1
O comando na linha crontab não está sendo analisado da maneira esperada.
O daemon cron executará o comando usando o shell configurado para o usuário em questão.
Este primeiro shell verá dois comandos, separados pelo &&
operador de controle. Portanto, o segundo comando é executado somente se o primeiro comando sair com um código de retorno zero, indicando sucesso.
O primeiro comando é: flock -xn /absolute/path/to/run.lock -c cd /absolute/path/to/project
.
O segundo comando é: ./run >> run.log
.
O primeiro comando criará o arquivo de bloqueio e executará o comando cd
como um processo filho, ou seja, em outra instância do shell. O cd
comando sem argumentos mudará para o diretório inicial do usuário, após o qual o shell executado por flock
será encerrado imediatamente. Isso equivalerá a não ter nenhum efeito.
Mesmo com o nome do caminho, o cd /absolute/path/to/project
comando aqui não teria nenhum efeito no diretório de trabalho doflock
comando, nem no segundo comando executado pela primeira instância do shell.Isso ocorre porque o cd
comando afeta apenas a instância específica do shell em que é executado, não seus pais.
O /absolute/path/to/project
é tratado como um nome de arquivo extra para o flock
comando, não como um parâmetro para cd
.
Como o primeiro comando foi encerrado e não relatou nenhum erro, a primeira instância do shell (originalmente iniciada pelo cron
daemon) irá agora executar o segundo comando. Como o diretório de trabalho desse shell não mudou, ele ainda é o diretório home do root
usuário, então ele acaba tentando executar o que é efetivamente /root/run >>/root/run.log
.
Meu palpite é que você provavelmente quis dizer algo assim:
* * * * * flock -xn /absolute/path/to/run.lock -c "cd /absolute/path/to/project && ./run >> run.log"
As aspas impedirão que o primeiro shell divida a linha de comando em &&
e, portanto, o segundo shell (iniciado pelo flock
comando) obterá toda a linha de comando restante e, portanto, o cd /absolute/path/to/project
comando será executado de forma significativa antes de ser executado ./run
no diretório do projeto.