Estou tentando fazer com que o cron chame os PATHs corretos. Quando executo um script Python a partir do shell, o script funciona bem, pois usa os PATHs definidos no bashrc, mas quando eu uso o cron, todos os PATHs não são usados no bashrc. Existe um arquivo no qual eu possa inserir os PATHs para o cron como bashrc ou uma maneira de chamar os PATHs a partir do bashrc?
Desculpe, acho que não escrevi isso corretamente, posso executar o script correto (o que significa que o PATH para o script no crontab não é o problema aqui); é apenas quando esse script está sendo executado que eu executo uma compilação e isso usa o CAMINHOS definidos .bashrc
. Quando executo o script quando estou logado, os .bashrc
PATHs são puxados. Como o cron não roda em um shell, por exemplo, ele não puxa .bashrc
. Existe uma maneira de extrair isso sem precisar escrever um wrapper de script bash?
source /etc/profile
: ele deve comer.bashrc
e muitas outras coisas potencialmente ausentes para você. O fornecimento explícito de perfis se torna bastante útil se você deseja que alguns scripts executem "autônomo", ele também protege de ambientes estranhos e ...sh
scripts chamados pelo crontab funcionem. Você pode confirmar se ele atualiza o caminho adicionando um trabalho como* * * * * echo $PATH > ~/crontab_path.txt
e verificando o arquivo após um minuto.Respostas:
Eu usei
/etc/crontab
. Eu useivi
e entrei nos CAMINHOS que eu precisava nesse arquivo e o executei como root. O crontab normal substitui os PATHs que você configurou. Um bom tutorial sobre como fazer isso .O arquivo cron em todo o sistema se parece com o seguinte:
fonte
/etc/crontab
estão disponíveis para cron quando executados como root no Ubuntu 14.04. (sudo crontab -e
)Provavelmente, o cron está sendo executado em um ambiente muito escasso. Verifique as variáveis de ambiente que o cron está usando, anexando um trabalho fictício que despeja
env
em um arquivo como este:Compare isso com a saída de
env
em uma sessão shell normal.Você pode anexar suas próprias variáveis de ambiente ao crontab local, definindo-as na parte superior do seu crontab.
Aqui está uma solução rápida para anexar
$PATH
ao crontab atual:O crontab resultante será semelhante à resposta de chrissygormley, com PATH definido antes das regras do crontab.
fonte
Você deve colocar caminhos completos no seu arquivo
crontab
. Essa é a opção mais segura.Se você não quiser fazer isso, pode colocar um script de wrapper em torno de seus programas e definir o PATH lá.
por exemplo
torna-se:
Além disso, qualquer coisa chamada from
cron
deve ter muito cuidado com os programas executados e provavelmente definir sua própria opção para aPATH
variável.EDITAR:
Se você não souber onde está o comando que deseja executar a
which <command>
partir do seu shell, ele informará o caminho.EDIT2:
Portanto, quando seu programa estiver em execução, a primeira coisa que ele deve fazer é definir
PATH
e qualquer outra variável necessária (por exemploLD_LIBRARY_PATH
) os valores necessários para a execução do script.Basicamente, em vez de pensar em como modificar o ambiente cron para torná-lo mais adequado ao seu programa / script - faça seu script manipular o ambiente fornecido, definindo um apropriado quando ele for iniciado.
fonte
crontab
.Definir PATH antes da linha de comando no meu crontab funcionou para mim:
fonte
Adicionar uma definição PATH no crontab do usuário com os valores corretos ajudará ... Enchi a minha apenas:
E é suficiente para que todos os meus scripts funcionem ... Inclua qualquer caminho personalizado lá, se necessário.
fonte
/etc/crontab
. Essa é a resposta mais fácil no nível do usuário. Bom trabalho @ Treviño. Vote se concordar.Faça com que suas variáveis funcionem para você, isso permitirá o acesso a t
Defina seu PATH em /etc/profile.d/*.sh
Variáveis de ambiente em todo o sistema
Arquivos com a extensão .sh no diretório /etc/profile.d são executados sempre que um shell de logon do bash é inserido (por exemplo, ao fazer login no console ou através do ssh), bem como pelo DisplayManager quando a sessão da área de trabalho é carregada.
Você pode, por exemplo, criar o arquivo /etc/profile.d/myenvvars.sh e definir variáveis como esta:
Execute o crontab com a opção de login!
CRONTAB executa script ou comando com variáveis de ambiente
fonte
Problema
Seu script funciona quando você o executa no console, mas falha no cron.
Causa
Seu crontab não possui as variáveis de caminho corretas (e possivelmente shell)
Solução
Adicione seu shell atual e localize o crontab
Script para fazer isso por você
Fonte
https://github.com/ssstonebraker/braker-scripts/blob/master/working-scripts/add_current_shell_and_path_to_crontab.sh
Saída de amostra
fonte
No meu AIX, o cron seleciona suas variáveis ambientais em / etc / environment, ignorando o que está definido no .profile.
Edit: Eu também fiz check-out de algumas caixas Linux de várias idades e estas também parecem ter esse arquivo, portanto, isso provavelmente não é específico do AIX.
Eu verifiquei isso usando a sugestão cron do joemaller e verificando a saída antes e depois da edição da variável PATH em / etc / environment.
fonte
Se você não quiser fazer as mesmas edições em vários lugares, faça o seguinte:
O . espaço e, em seguida, o caminho para .bashrc e o comando && são a mágica para fazer com que seu ambiente mude para o shell bash em execução. Além disso, se você realmente deseja que o shell seja básico, é uma boa idéia ter uma linha no seu crontab:
Espero que ajude alguém!
fonte
O ambiente padrão para tarefas cron é muito escasso e pode ser muito diferente do ambiente em que você desenvolve seus scripts python. Para um script que pode ser executado no cron, qualquer ambiente do qual você dependa deve ser definido explicitamente. No próprio arquivo cron, inclua caminhos completos para os executáveis python e seus scripts python.
fonte
Sei que isso já foi respondido, mas achei que o dele seria útil para alguns. Eu tive um problema semelhante que resolvi recentemente ( encontrado aqui ) e aqui estão os destaques das etapas que eu segui para responder a essa pergunta:
verifique se você possui as variáveis necessárias em PYTHONPATH (encontradas aqui e aqui e para obter mais informações aqui) dentro do .profile ou .bash_profile para qualquer shell em que você queira testar seu script para garantir que ele funcione.
edite seu crontab para incluir os diretórios necessários para executar seu script em um trabalho cron (encontrado aqui e aqui)
a) certifique-se de incluir o diretório raiz na variável PATH (.), conforme explicado aqui (basicamente, se você estiver executando um executável com seu comando, ele precisará encontrar o diretório raiz ou o diretório em que o executável está armazenado) e provavelmente estes (/ sbin: / bin: / usr / sbin: / usr / bin)
no seu arquivo crontab, crie um cronjob que altere o diretório para o diretório em que você executou o script com êxito antes (ou seja, Usuários / usuário / Documentos / foo)
a) Será semelhante ao seguinte:
fonte
@ Trevino: sua resposta me ajudou a resolver meu problema. No entanto, para um iniciante, tente dar uma abordagem passo a passo.
$ echo $JAVA_HOME
$ crontab -e
* * * * * echo $PATH
- isso permite que você entenda qual é o valor PATH que está sendo usado pelo crontab no momento. Execute o crontab e pegue o valor $ PATH usado pelo crontab.crontab -e
; b)PATH=<value of $JAVA_HOME>/bin:/usr/bin:/bin
(é um caminho de amostra); c) agora, como seu trabalho / script agendado*/10 * * * * sh runMyJob.sh &
; d) removaecho $PATH
do crontab como não é necessário agora.fonte
Defina o PATH necessário em seu cron
Editar: Pressione
i
Salvar e sair
:wq
fonte
A solução mais simples que encontrei se parece com isso:
Este exemplo chama
su
como usuário root e inicia o shell com o ambiente completo do usuário, incluindo $ PATH, definido como se eles estivessem conectados. Funciona da mesma forma em distros diferentes, é mais confiável do que fornecer. me) e evita caminhos específicos codificados, o que pode ser um problema se você estiver fornecendo um exemplo ou ferramenta de configuração e não souber qual distribuição ou layout de arquivo no sistema do usuário.Você também pode especificar o nome de usuário depois
su
se desejar um usuário diferente do root, mas provavelmente deverá deixar oroot
parâmetro beforesu
command, pois isso garantesu
privilégios suficientes para alternar para qualquer usuário especificado.fonte
Se você usar
webmin
, estas são as etapas de como definir oPATH
valor:fonte