Script Crontab em diretório diferente não funciona

Script Crontab em diretório diferente não funciona

Tentei atualizar minha base de código diariamente usando o seguinte comando crontab. Mas o primeiro passo não funcionou quando testei.

27 15 * * * . cd /home/covuser/user/ && . /home/covuser/user/conf.sh
40 17 * * * . cd /home/covuser/user && . /home/covuser/user/checkout.sh

conf.sh contém a variável de ambiente necessária para fazer o checkout do código. O arquivo checkout.sh faz o processo de checkout.

A primeira linha deve definir a variável de ambiente necessária. Mas isso não está acontecendo.

Que erro cometi nisso? Desde já, obrigado.

Responder1

Cada linha do seu crontab representa um trabalho separado, que será agendado e executado de forma independente.

Isso significa, especialmente no seu caso, que eles são executados em diferentes sessões de shell, de modo que a origem de um arquivo de script para definir algumas variáveis ​​de ambiente em um trabalho não afetará o ambiente no qual outro trabalho será executado posteriormente.

Você teria que alterar seu processo e executar os dois scripts na mesma sessão de shell e, portanto, mais facilmente apenas no mesmo cron job.

Se precisar de um atraso entre as execuções, você poderá conseguir isso, por exemplo, em sleepvez de agendar um trabalho diferente com um horário posterior fixo.


Ah, e é claro, como apontado em alguns dos outros comentários e respostas, você só pode criar scripts para .fazê-los rodar no ambiente shell atual, em vez de em um subshell. No entanto, cdnão é um script, mas um comando shell integrado, que sempre é executado no ambiente shell atual, portanto, escrever . cd somehweretambém é um erro.

Responder2

Acredito que o problema esteja no .seu arquivo cd.

.(alias fro source) permite que você forneça um arquivo. Isso não funciona para shell internos, como cd, pois não são arquivos executáveis ​​que podem ser originados.

À medida que você concatena os dois comandos com um AND - &&, o shell ignora qualquer comando após aquele que falhar, pois eles não alterarão o valor do resultado resultante ( false && true == false). Você pode substituir the &&por a ;se desejar outro comportamento.

Isso deve funcionar:

27 15 * * * cd /home/covuser/user/ && . /home/covuser/user/conf.sh
40 17 * * * cd /home/covuser/user && . /home/covuser/user/checkout.sh

Atualizar: Se os scripts forem dependentes (quais são, eu acho?), execute tudo em uma única sessão. (Uma nova sessão bash será aberta para executar cada entrada do cron)

27 15 * * * cd /home/covuser/user/ && . /home/covuser/user/conf.sh && . /home/covuser/user/checkout.sh

informação relacionada