comando rebanho no cron raiz não será executado

comando rebanho no cron raiz não será executado

Eu tenho o seguinte código no meu rootcrontab no meu Debian

* * * * * flock -xn /absolute/path/to/run.lock -c cd /absolute/parth/to/project && ./run >> run.log

Mas não vejo run.lognenhum run.lockarquivo onde os especifico. Na verdade, não há evidências de que o script tenha sido executado.

Executar ps aux | grep runapenas produz essa grepchamada.

Como executo o runscript usando flockna 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 cdcomo um processo filho, ou seja, em outra instância do shell. O cdcomando sem argumentos mudará para o diretório inicial do usuário, após o qual o shell executado por flockserá encerrado imediatamente. Isso equivalerá a não ter nenhum efeito.

Mesmo com o nome do caminho, o cd /absolute/path/to/projectcomando 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 cdcomando 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 flockcomando, 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 crondaemon) irá agora executar o segundo comando. Como o diretório de trabalho desse shell não mudou, ele ainda é o diretório home do rootusuá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 flockcomando) obterá toda a linha de comando restante e, portanto, o cd /absolute/path/to/projectcomando será executado de forma significativa antes de ser executado ./runno diretório do projeto.

informação relacionada