Chamando scripts de dentro de outros scripts

3

Eu tenho um script que eu chamo a cada 10 minutos com um cronjob:

*/10 * * * * ~/mydirectory/myscript.sh

Agora, dentro de ~/mydirectory , há outro script, digamos myotherscript.sh , que eu gostaria de chamar de myscript.sh . Ambos os scripts foram chmod para serem executáveis e quando executo myscript.sh da linha de comando dentro de ~/mydirectory , tudo funciona bem. Eu executo da seguinte forma:

. myscript.sh

Mas não parece que o cronjob funciona. Quando eu removo a referência para o segundo script de dentro do script primário, ele funciona, então eu suspeito que há algo errado com a maneira como faço referência ao segundo script. É assim que o conteúdo de myscript.sh se parece:

#! /bin/bash
do-something
do-something-else
. myotherscript.sh

Será que, quando o cronjob for executado, o diretório atual não será ~/mydirectory e, portanto, o cronjob não conseguirá encontrar o arquivo myotherscript.sh ? Se sim, como faço para ver o arquivo? Eu não quero especificar o caminho absoluto dentro do script primário, como eu poderia querer movê-lo (e myotherscript.sh ) para outro diretório em algum momento ou eu poderia querer renomear ~/mydirectory em algum momento e eu não em seguida, deseja alterar o conteúdo de myscript.sh para fazer referência ao novo caminho absoluto.

PERGUNTA DE BÔNUS: Agora, quando é hora de executar o cronjob, basicamente eu apenas mantenho os polegares e espero o melhor, mas não tenho como ver se foi bem-sucedido e se ele falhou, por que falhou. Alguma dica de como eu posso ver porque o cronjob não foi executado como esperado?

    
por Dewald Swanepoel 27.03.2015 / 21:37

4 respostas

4

OK, então a resposta de Glenn Jackman funciona e também respondeu à minha pergunta de bônus, mas eu descobri outra e acredito ser a forma mais elegante de garantir que o cronjob seja executado no diretório em que os scripts estão localizados. / p>

Simplesmente substituindo

*/10 * * * * ~/mydirectory/myscript.sh

com

*/10 * * * * cd ~/mydirectory && ./myscript.sh

E isso resolve o problema. Tudo funciona.

    
por 27.03.2015 / 22:37
2

Você está chamando o script incorretamente. Deve ser:

#! /bin/bash
do-something
do-something-else
./myotherscript.sh;
    
por 27.03.2015 / 21:39
2

myscript deve ter:

cd "$(dirname "$0")"
. ./myotherscript.sh

Quando o cron inicia seu script, o $ PWD pode ser / , então você deve ir para onde seu script está localizado, se você quiser usar caminhos relativos.

Você pode achar útil registrar a saída do seu script:

*/10 * * * * ~/mydirectory/myscript.sh 2>&1 | /usr/bin/ts '[%FT%T]' >> ~/mydirectory/myscript.log

ts adiciona um registro de data e hora a cada linha de entrada. No Fedora e no Ubuntu, está no pacote moreutils .

    
por 27.03.2015 / 21:46
0

Definir um PATH e MAILTO dentro do crontab deve ajudar.

    
por 27.03.2015 / 21:48