Como posso executar um comando cron com variáveis ambientais existentes?
Se eu estiver em um prompt de shell, posso digitar echo $ORACLE_HOME
e obter um caminho. Esta é uma das minhas variáveis ambientais que é definida na minha ~/.profile
. No entanto, parece que ~/.profile
não é carregado de scripts cron e, portanto, meus scripts falham porque a $ORACLE_HOME
variável não está definida.
Em esta questão o autor menciona a criação de um ~/.cronfile
perfil que estabelece variáveis para cron, e então ele faz uma solução alternativa para carregar todos os seus comandos cron em scripts que ele mantém em seu ~/Cron
diretório. Um arquivo ~/.cronfile
parece uma boa idéia, mas o restante da resposta parece um pouco complicado e eu esperava que alguém pudesse me dizer uma maneira mais fácil de obter o mesmo resultado.
Suponho que, no início dos meus scripts, eu possa adicionar algo parecido, source ~/.profile
mas que parece ser redundante.
Então, como posso fazer meus scripts cron carregar as variáveis do meu perfil de shell interativo?
source ~/.profile
a um programa é redundante? Os programas herdam seu ambiente do programa de chamada. Se esse programa de chamada não for o seu shell, como o programa decendente obterá o ambiente que você deseja?su -l
para configurar um ambiente de login normal, incluindo o $ PATH para root ou outro usuário específico.Respostas:
No crontab, antes de você comandar, adicione
. $HOME/.profile
. Por exemplo:Cron
não sabe nada sobre a sua concha; é iniciado pelo sistema, portanto, possui um ambiente mínimo. Se você quer alguma coisa, precisa trazer isso para si mesmo.fonte
.
antes do script? (não sei como eu fariaman
isso). Por que isso é diferentesource
?.
comando é o comando original parasource
. Eles são equivalentes dentro do shell e um pouco mais fáceis de digitar, especialmente dentro de um crontab. Para obter mais informações, digitehelp .
ou pesquise^SHELL BUILTIN COMMANDS
na página de manualbash
ou na parte superior do tipoman
zshbuiltins .`. Running
informa que o comando é interno..profile
por.bash_profile
. Verifique qual.profile
arquivo existe no diretório inicial do usuário.Outra opção, 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
/bin/bash
como shell. Fiquei me perguntando por que coisas comocd /path/to/project; source .vars
funcionariam quando eu as digitasse manualmente, mas falhariam (File not found
) quando incluídas em um cronjob. A linha principal para mim foi a configuração,SHELL=/bin/bash
para que eu pudesse realmente usar comandos familiares do bash em cada cronjob./bin/sh/
(o cron shell padrão, aparentemente) é muito limitador.EnvironmentFile
unidade de serviço. Pena que o cron não tenha algo parecido.$SHELL
for/bin/sh
, osource
comando não existe. Use em.
vez disso.Outra opção, que eu acho mais fácil, é executar o script com cron e dizer ao bash para efetuar login (portanto, usando
/etc/profile.d/...
definições de ambiente)No
crontab -e
arquivo:Qualquer comando após a fonte de
.bash_profile
terá seu ambiente como se você estivesse conectado.fonte
Péssima ideia. A prática geral é definir especificamente todas as variáveis ambientais necessárias em um script que deve ser executado a partir de uma tarefa cron.
fonte
/usr/bin/env
comando para definir as variáveis e, em seguida, agir como o processo do ambiente para o cronjob.envdir
vem à mente também.~/.cronvars
e incluí-lo no perfil e também nos meus scripts cron. Eu não quero codificar variáveis de ambiente em cada um dos scripts que eu executo, porque quando os caminhos mudam os caminhos codificados em cada arquivo não são fáceis de manter. Parece que isso permitiria um local centralizado para as variáveis necessárias e ainda impediria o carregamento de outras variáveis.Essa sintaxe definitivamente ajuda você. Eu não entendo a sintaxe, mas funciona. A Oracle usa essa sintaxe, ao implantar o Oracle Configuration Manager no crontab, portanto, acredito que esta é a solução certa.
fonte
Recentemente, deparei-me com um caso em que eu tinha que executar o cronjob geral como root, mas, ao mesmo tempo, tinha que executar um subcomando como um usuário diferente (o que exigia o fornecimento do ambiente desse usuário). Eu fui com a seguinte abordagem:
A parte crucial é o argumento
-i
que está sendo passado para osudo
qual executará o comando fornecido em um shell de login separado (o que, por sua vez, significa que os arquivos de pontos do usuário serão originados).PS: Note que a
user
coluna está disponível apenas no/etc/crontab
e os/etc/cron.d/*
arquivos.fonte
A solução, que funcionou para mim, é descrita aqui .
Você cria um script de wrapper, que chama
. ~/.cronfile
e, em seguida, faz o que deseja. Este script é iniciado pelo cron.Em
~/.cronfile
você especifica o ambiente para seus trabalhos cron.fonte
Sim, você pode usar "soluções alternativas conhecidas" (algumas das quais foram listadas). Essa é outra maneira de dizer que todo mundo sabe que é péssimo, embora algumas pessoas se refiram a isso como um "recurso de segurança" porque gastaram pelo menos o máximo de tropeço nessa falha (ure) que você e gostariam de pensar que tempo perdido não era por nada. É o equivalente cron do teclado QWERTY.
Suspeito que o motivo original possa ter sido o desempenho, de modo que os scripts executados uma vez por minuto não gastem tempo para ler scripts rc. Também originalmente o cron não era realmente configurável, então um padrão era realmente a única opção.
Não há segurança adicional por não ter uma configuração ou método simples para que o cron assuma o ambiente do seu shell interativo, em vez de os usuários terem que executar uma ginástica estúpida do shell. Em uma máquina moderna, geralmente não há ganho perceptível de desempenho, a menos que você tenha uma grande quantidade de trabalhos sendo executados a cada minuto.
A cultura Unix falha. Na minha humilde opinião. :-)
fonte
Adicionar, acrescentar
para o crontab. Consulte Como garantir a disponibilidade de $ BASH_ENV
fonte
Em vez de definir o perfil, o que me ajudou foi definir o
PATH
. Alguns dos comandos não estavam disponíveis nos meus scripts cron, pois oPATH
é diferente.Definir
PATH
com o caminho dos comandos me ajudou. Melhor ainda, se você pode usar um modelo e desmembrar mais tarde,Passar variáveis para cada item parece confuso.
fonte
Eu coloco .
~/.dbus/session-bus/*
no topo do meu script desejado :)fonte