linux - manualmente - crontab ubuntu



Onde posso definir variáveis de ambiente que o crontab usará? (8)

Ao invés de

0  *  *  *  *  sh /my/script.sh

Use bash -l -c

0  *  *  *  *  bash -l -c 'sh /my/script.sh'

https://src-bin.com

Eu tenho um crontab correndo a cada hora. O usuário que o executa tem variavel de ambiente no .bash_profile que funciona quando o usuário executa o trabalho a partir do terminal, no entanto, obviamente, eles não são escolhidos pelo crontab quando é executado.

Eu tentei configurá-los em .profile e .bashrc mas eles ainda não parecem ter sido escolhidos. Alguém sabe onde eu posso colocar vars de ambiente que crontab pode pegar?


Answer #1

Configurando vars em /etc/environment também funcionou para mim no Ubuntu. A partir de 12.04, variáveis ​​em /etc/environment são carregadas para o cron.


Answer #2

Eu tentei a maioria das soluções fornecidas, mas nada funcionou no começo. Acontece, no entanto, que não foram as soluções que não funcionaram. Aparentemente, meu arquivo ~/.bashrc começa com o seguinte bloco de código:

case $- in
    *i*) ;;
    *) return;;
esac

Basicamente, é uma case statement que verifica o conjunto atual de opções no shell atual para determinar se o shell está sendo executado de forma interativa. Se o shell estiver sendo executado de forma interativa, ele passará para o arquivo ~/.bashrc . No entanto, em um shell chamado pelo cron , a variável $- não contém o valor i que indica interatividade. Portanto, o arquivo ~/.bashrc nunca é totalmente originado. Como resultado, as variáveis ​​de ambiente nunca foram definidas. Se este for o seu problema, sinta-se à vontade para comentar o bloco de código da seguinte forma e tentar novamente:

# case $- in
#     *i*) ;;
#     *) return;;
# esac

Espero que isso seja útil


Answer #3

Expandir no @Robert Brisita acaba de expandir, também se você não quiser configurar todas as variáveis ​​do perfil no script, você pode selecionar as variáveis ​​para exportar no topo do script

No arquivo crontab -e:

SHELL=/bin/bash

*/1 * * * * /Path/to/script/script.sh

Em script.sh

#!/bin/bash
export JAVA_HOME=/path/to/jdk

some-other-command

Answer #4

Outra maneira - inspirada por essa resposta - de "injetar" variáveis ​​é a seguinte (exemplo de fcron):

%daily 00 12 \
    set -a; \
    . /path/to/file/containing/vars; \
    set +a; \
    /path/to/script/using/vars

Do help set :

-a Variáveis ​​de marca que são modificadas ou criadas para exportação.

Usando + em vez de - faz com que esses sinalizadores sejam desativados.

Então tudo entre set - e set + é exportado para env e então está disponível para outros scripts, etc. Sem usar set as variáveis ​​são originadas mas vivem apenas no set .

Além disso, também é útil passar variáveis ​​quando um programa requer que uma conta não-root seja executada, mas você precisaria de algumas variáveis ​​dentro do ambiente do outro usuário. Abaixo está um exemplo passando em nullmailer vars para formatar o cabeçalho do e-mail:

su -s /bin/bash -c "set -a; \
                    . /path/to/nullmailer-vars; \
                    set +a; \
                    /usr/sbin/logcheck" logcheck

Answer #5

Para mim eu tive que definir a variável de ambiente para um aplicativo php. Eu o reslalei adicionando o seguinte código ao meu crontab.

$ sudo  crontab -e

crontab:

ENVIRONMENT_VAR=production

* * * * * /home/deploy/my_app/cron/cron.doSomethingWonderful.php

e dentro de doSomethingWonderful.php eu poderia obter o valor do ambiente com:

<?php     
echo $_SERVER['ENVIRONMENT_VAR']; # => "production"

Eu espero que isso ajude!


Answer #6

Ter o 'cron' executando um script de shell que define o ambiente antes de executar o comando.

Sempre.

#   @(#)$Id: crontab,v 4.2 2007/09/17 02:41:00 jleffler Exp $
#   Crontab file for Home Directory for Jonathan Leffler (JL)
#-----------------------------------------------------------------------------
#Min     Hour    Day     Month   Weekday Command
#-----------------------------------------------------------------------------
0        *       *       *       *       /usr/bin/ksh /work1/jleffler/bin/Cron/hourly
1        1       *       *       *       /usr/bin/ksh /work1/jleffler/bin/Cron/daily
23       1       *       *       1-5     /usr/bin/ksh /work1/jleffler/bin/Cron/weekday
2        3       *       *       0       /usr/bin/ksh /work1/jleffler/bin/Cron/weekly
21       3       1       *       *       /usr/bin/ksh /work1/jleffler/bin/Cron/monthly

Os scripts em ~ / bin / Cron são todos links para um único script, 'runcron', que se parece com:

:       "$Id: runcron.sh,v 2.1 2001/02/27 00:53:22 jleffler Exp $"
#
#       Commands to be performed by Cron (no debugging options)

#       Set environment -- not done by cron (usually switches HOME)
. $HOME/.cronfile

base=`basename $0`
cmd=${REAL_HOME:-/real/home}/bin/$base

if [ ! -x $cmd ]
then cmd=${HOME}/bin/$base
fi

exec $cmd ${@:+"[email protected]"}

(Escrito usando um padrão de codificação mais antigo - hoje em dia, eu usaria um shebang '#!' No começo.)

O '~ / .cronfile' é uma variação do meu perfil para uso pelo cron - rigorosamente não interativo e sem ecoar por causa de ser ruidoso. Você poderia organizar para executar o .profile e assim por diante. (O material REAL_HOME é um artefato do meu ambiente - você pode fingir que é o mesmo que $ HOME).

Portanto, esse código lê o ambiente apropriado e, em seguida, executa a versão não Cron do comando do meu diretório inicial. Então, por exemplo, meu comando 'dia da semana' se parece com:

:       "@(#)$Id: weekday.sh,v 1.10 2007/09/17 02:42:03 jleffler Exp $"
#
#       Commands to be done each weekday

# Update ICSCOPE
n.updics

O comando 'diário' é mais simples:

:       "@(#)$Id: daily.sh,v 1.5 1997/06/02 22:04:21 johnl Exp $"
#
#       Commands to be done daily

# Nothing -- most things are done on weekdays only

exit 0

Answer #7

Tudo o que você definir no crontab estará disponível nos cronjobs, diretamente e usando as variáveis ​​nos scripts.

Use-os na definição do cronjob

Você pode configurar o crontab para que ele defina variáveis ​​que, então, o uso do cron pode:

$ crontab -l
myvar="hi man"
* * * * * echo "$myvar. date is $(date)" >> /tmp/hello

Agora o arquivo /tmp/hello mostra coisas como:

$ cat /tmp/hello 
hi man. date is Thu May 12 12:10:01 CEST 2016
hi man. date is Thu May 12 12:11:01 CEST 2016

Use-os no script executado pelo cronjob

Você pode configurar o crontab para que ele defina as variáveis ​​que os scripts podem usar:

$ crontab -l
myvar="hi man"
* * * * * /bin/bash /tmp/myscript.sh

E digamos que o script /tmp/myscript.sh seja assim:

echo "Now is $(date). myvar=$myvar" >> /tmp/myoutput.res

Ele gera um arquivo /tmp/myoutput.res mostrando:

$ cat /tmp/myoutput.res
Now is Thu May 12 12:07:01 CEST 2016. myvar=hi man
Now is Thu May 12 12:08:01 CEST 2016. myvar=hi man
...




crontab