ambiente crontab

7

Eu escrevi vários scripts para iniciar aplicativos do servidor Java, que normalmente são executados por 24 horas antes de serem encerrados (invocando o mesmo script com um parâmetro diferente).

O script depende de variáveis de ambiente definidas em um arquivo: ~/<user>.env , que eu origem de .bashrc .

Isso funciona bem quando invoco o script a partir da linha de comando, mas se eu quiser adicionar o script como uma entrada crontab, me deparo com o problema em que .bashrc não é lido.

Minha pergunta: qual é a abordagem de melhor prática para resolver esse problema? Eu percebo que eu poderia definir uma entrada crontab como:

* * * * 1-5 /usr/bin/bash -c '. /home/myuser/myuser.env && /home/myuser/scripts/myscript.sh'

... mas isso parece feio. Alternativamente, eu poderia obter myuser.env no início de cada script, mas isso se tornaria um pesadelo a ser mantido.

Qualquer ajuda apreciada.

    
por Adamski 19.02.2010 / 18:27

6 respostas

10

Na verdade, descobri uma solução bastante elegante adicionando o sinalizador '-l' (--login) ao meu comando bash, o que faz com que ele forneça todos os arquivos de login, incluindo .bashrc. Daí meu comando crontab é simplesmente:

* * * * 1-5 /usr/bin/bash -lc '/mnt/group/core/deploy/scripts/test.sh' > /dev/null 2>&1
    
por 25.02.2010 / 11:57
11

Eu costumo endereçar isso com um script short wrapper:

#!/bin/bash
[ -r $HOME/.bashrc ] && . $HOME/.bashrc
[ -r $HOME/.profile ] && . $HOME/.profile
exec "$@"

Em seguida, prefixar o comando no crontab com o seu wrapper:

* * * * 1-5 ~/scripts/cron-wrapper ~/scripts/myscript.sh
* * * * 1-5 ~/scripts/cron-wrapper ~/scripts/myotherscript.sh

Alguns As versões do cron permitem que você defina variáveis diretamente no crontab. Infelizmente, não consigo usá-los no trabalho.

    
por 20.02.2010 / 01:01
3

Uma opção alternativa (embora não necessariamente melhor) seria adicioná-los ao crontab do root e fazer com que a entrada use su com um traço para se tornar o usuário em questão. As variáveis de ambiente seriam, então, puxadas automaticamente através do ambiente de shell padrão do usuário em ~ / .bashrc ou algo semelhante. por exemplo:

* * * * 1-5 su - scriptuser '/home/myuser/scripts/myscript.sh' Isso executaria o trabalho como scriptuser, com todas as variáveis de ambiente de um login apropriado. A desvantagem é que o próprio scriptuser não poderia configurar esse trabalho - isso exigiria privilégios de root para fazer isso.

    
por 19.02.2010 / 20:59
1

A solução cron-wrapper funcionou para mim com uma modificação, eu precisava substituir o $ HOME pelo caminho absoluto para a pasta home do usuário, neste caso era:

#!/bin/bash
[ -r /root/.bashrc ] && . /root/.bashrc
[ -r /root/.profile ] && . /root/.profile
exec "$@"
    
por 29.04.2010 / 13:43
0

A única outra coisa em que posso pensar seria baseada em:

bash -i --rcfile 'init' -c 'script'

que é provavelmente menos atraente.

    
por 19.02.2010 / 18:41
0

Versões recentes do cron permitem que você defina variáveis de ambiente arbitrárias antes de executar tarefas. Então você pode adicionar isso ao seu crontab:

CRON = 1

Em seguida, no seu .bash_login faça algo assim:

[-n "$ CRON"] & & . .bashrc

    
por 16.07.2014 / 12:46