Faça com que 'cron' execute um script de shell que defina 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 ${@:+"$@"}
(Escrito usando um padrão de codificação mais antigo - atualmente, eu usaria um '#!' No início.)
O '~ / .cronfile' é uma variação do meu perfil para uso pelo cron - rigorosamente não interativo e sem eco por causa de ser barulhento. Você pode organizar a execução do .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 executa a versão não Cron do comando no meu diretório pessoal. 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
Eu tenho mais uma solução para este problema:
Nesse caso, ele selecionará toda a variável de ambiente definida no seu
$HOME/.profile
arquivo.Claro
$HOME
também não está definido, você deve substituí-lo pelo caminho completo do seu$HOME
.fonte
source ~/.bashrc
, e acontece que meu.bashrc
arquivo está meio que em conflito com o trabalho cron. Se eu usar um.env_setup_rc
arquivo muito simples com apenas uma linhaexport MY_ENV_VAR=my_env_val
:, ele realmente funciona. Veja meu post: stackoverflow.com/questions/15557777/...Definir vars
/etc/environment
também funcionou para mim no Ubuntu. A partir de 12.04, as variáveis in/etc/environment
são carregadas para cron.fonte
env >> /etc/environment
e agora todos os envios atuais estão disponíveis nos trabalhos do CRON.env >> /etc/environment
falhará se houver um sinal de hash em uma das variáveis de ambiente. Eu tive mais dificuldade em solucionar meu aplicativo. Acabou sendo uma senha contendo '#' que estava sendo truncada nessa etapa.Se você iniciar os scripts que está executando através do cron com:
Eles devem pegar suas
~/.bash_profile
variáveis de ambientefonte
root
o crontab? Não existe uma/home/root
pasta no meu sistema e, portanto, não vejo como isso funcionaria comroot
o crontab. Ideias?#!/bin/bash
. A mágica aqui é adicionar-l
Expandir o exemplo @carestad, que eu acho mais fácil, é executar o script com cron e ter o ambiente no script.
No arquivo crontab -e:
No arquivo cron_job.sh:
Qualquer comando após a origem do arquivo .bash_profile terá seu ambiente como se você estivesse conectado.
fonte
Para mim, eu tive que definir a variável de ambiente para um aplicativo php. Eu o adorei adicionando o seguinte código ao meu crontab.
crontab:
e dentro doSomethingWonderful.php eu poderia obter o valor do ambiente com:
Eu espero que isso ajude!
fonte
Tudo o que você definir
crontab
estará disponível nos cronjobs, diretamente e usando as variáveis nos scripts.Use-os na definição do cronjob
Você pode configurar
crontab
para que ele defina variáveis que o cronjob pode usar:Agora o arquivo
/tmp/hello
mostra coisas como:Use-os no script executado pelo cronjob
Você pode configurar
crontab
para que ele defina variáveis que os scripts possam usar:E digamos que o script
/tmp/myscript.sh
é assim:Ele gera um arquivo
/tmp/myoutput.res
mostrando:fonte
A expansão no @Robert Brisita acabou de expandir, também se você não quiser configurar todas as variáveis do perfil no script, poderá selecionar as variáveis a serem exportadas na parte superior do script
No arquivo crontab -e:
Em script.sh
fonte
Ao invés de
Use bash -l -c
fonte
-l
seguinte#!/bin/bash -l
:? Essa outra resposta é simples e elegante.Estou usando
Oh-my-zsh
no meu macbook e tentei várias coisas para executar a tarefa crontab, mas, finalmente, minha solução foi anexar o.zshrc
antes do comando ser executado.Esta tarefa é executada a cada 30 minutos e usa
.zshrc
perfil para executar o comando my node.Não se esqueça de usar o ponto antes da
$HOME
var.fonte
Outra maneira - inspirada por esta resposta - de "injetar" variáveis é a seguinte (exemplo fcron):
De
help set
:Portanto, tudo o que é exportado
set -
eset +
exportado paraenv
e fica disponível para outros scripts, etc. Sem o usoset
das variáveis, é possível obter apenas a fonteset
.Além disso, também é útil passar variáveis quando um programa exige que uma conta não raiz seja executada, mas você precisa de algumas variáveis dentro do ambiente desse outro usuário. Abaixo está um exemplo passando em nullmailer vars para formatar o cabeçalho do email:
fonte
Tentei a maioria das soluções fornecidas, mas nada funcionou no começo. Acontece, porém, que não foram as soluções que falharam no trabalho. Aparentemente, meu
~/.bashrc
arquivo começa com o seguinte bloco de código:Isso basicamente é um
case statement
que verifica o conjunto atual de opções no shell atual para determinar se o shell está sendo executado interativamente. Se o shell estiver executando interativamente, ele passará para a fonte do~/.bashrc
arquivo. No entanto, em um shell invocado porcron
, a$-
variável não contém oi
valor que indica interatividade. Portanto, o~/.bashrc
arquivo nunca é totalmente adquirido. Como resultado, as variáveis de ambiente nunca foram definidas. Se esse for o seu problema, sinta-se à vontade para comentar o bloco de código da seguinte forma e tente novamente:Espero que isso seja útil
fonte
Você também pode anexar seu comando
env
para injetar variáveis de ambiente da seguinte maneira:fonte