Eu defini a variável "SHELL" no arquivo / etc / crontab:
[martin@martin ~]$ grep SHELL /etc/crontab
SHELL=/usr/local/bin/bash
[martin@martin ~]$ file /usr/local/bin/bash
/usr/local/bin/bash: ELF 32-bit LSB executable, Intel 80386, version 1 (FreeBSD), dynamically linked (uses shared libs), for FreeBSD 8.0 (800107), stripped
[martin@martin ~]$
Além disso, todos os meus scripts no arquivo / etc / crontab são iniciados no usuário "martin". No entanto, /home/martin/.bash_profile (para shell de login) e /home/martin/.bashrc (para shell que não é de log) contêm algumas variáveis que são ignoradas no caso de um trabalho cron, mas são usadas no caso de eu entrar na máquina SSH ou abra uma nova sessão do bash. Por que cron ignora essas variáveis? O cron não está simplesmente executando "/ usr / local / bin / bash my-script.sh" com permissões para o usuário "martin"?
.bashrc
tem uma linha que impede sua execução em shells não interativos.Respostas:
Você pode originar o arquivo que deseja na parte superior do script ou no início do trabalho para o usuário que está executando o trabalho. O comando "source" é um built-in. Você faria o mesmo se fizesse edições nesses arquivos para carregar as alterações.
ou
fonte
bash
shell. Eu adicionei uma resposta que pode lidar com o caso quando o shell ésh
.Porque não é um shell interativo. O mesmo acontece quando você abre alguns terminais.
Dê uma olhada nesta pergunta: O que é o arquivo .bashrc? | Superusuário
E também neste:
Qual é a diferença entre .bashrc, .bash_profile e .environment? | Estouro de pilha
Scripts diferentes são acionados dependendo se a conexão é um shell de login (ou não), um shell interativo (ou não) ou ambos.
Se você deseja fazer o bashrc, precisará fazer esta alteração:
Fonte: Arquivos de inicialização do Bash | Manual de Referência do Bash | gnu.org
fonte
Talvez você não consiga executar
source
se osh
shell estiver sendo usado. Isso pode ser alterado adicionando a seguinte linha no seu crontab:Você também pode especificar o ambiente:
ou você pode usar o seu local
/home/user/.bashrc
se for um trabalho cron do usuário (por exemplocrontab -e
).Observe que
.bash_profile
pode substituir.bashrc
, se existir.Crédito: Como alterar o cron shell (sh para bash)?
fonte
SHELL=/bin/bash && source /home/YOUR_USER_NAME/.bash_profile && sh ....
Outra coisa que pode interferir na origem do seu
.bashrc
de um cronjob é a verificação que esse arquivo faz para detectar shells interativos.Por exemplo, no Ubuntu 18.04, o padrão
.bashrc
para um usuário começa com isso:e, portanto, a terceirização não fará nada de útil, pois será encerrada imediatamente.
fonte
Você pode invocar o bash com a
-l
opção, assim:A
-l
opção faz do bash um shell de login . Assim, ele lerá o usuário.bash_profile
. Ele não lerá o usuário, a.bashrc
menos que seja explicitamente fornecido por.bash_profile
. Isso ocorre porque os shells não interativos não são lidos automaticamente.bashrc
. Mas você não deve precisar.bashrc
de um trabalho cron, pois.bashrc
é para definir coisas úteis para um shell interativo .Variações:
Se o bash estiver no PATH, não será necessário especificar um caminho absoluto:
Uma otimização seria substituir o shell atual usando
exec
:fonte
bash
age de maneira diferente, seja um shell ou uma linguagem de programação normal (comoperl
oupython
).Por design, as configurações em
~/.bash_profile
,~/.bashrc
etc. são para que os usuários definam as coisas quandobash
desempenham o papel de um shell (shell de login, shell interativo). Pense no ambiente que você possui em umxterm
(shell interativo) ou emssh
sessões (shell de login) ou em consoles (shell de login).Por outro lado,
bash
também é uma poderosa linguagem de programação - pense em muitos scripts para gerenciar serviçossystemd
- que requer um estilo diferente de trabalho. Por exemplo, quando um desenvolvedor está escrevendo um script do sistema ou umbash
programa, ele / ela não gosta de fornecer o usuário~/.bash_profile
automaticamente. É um programa normal, não um shell. Um programa normal (incluindobash
programas) seria naturalmente herdar as configurações do evironement de trabalho atual (shell), mas não definir -los.Se escrevermos um programa para
cron
inbash
- ele simplesmente será escritobash
; na verdade, podemos escrever empython
ouperl
ou qualquer outra programação language- então podemos ter uma opção de fontesbash
's~/.bash_profile
(leia-se: a criação de shell do usuário, que só acontece de ser o mesmo idioma de sua linguagem de programação):No entanto, e se esse usuário em particular não usar
bash
como seu shell? Ele / ela pode usarzsh
,ksh
,fish
, etc. Então, essa prática não seria realmente trabalhar ao escrever programa para uso público.Então, você pode pesquisar
~/.bash_profile
se acha que funcionará. Mas, aqui, não se trata de saber se somos capazes de obter um arquivo, mas de como as coisas devem funcionar no sistema: o conceito de design . Em resumo: devemos verbash
como algo que tem dois papéis: linguagem shell e programação . Então tudo será muito mais fácil de entender.fonte
Eu tive o mesmo problema ao executar um aplicativo de nó do cron que usa o NVM. Para fazer com que o bash shell leia o arquivo .bashrc do cron, chame o comando bash com a opção de shell interativa `-l.
por exemplo:
* * * * * /bin/bash -lc '/home/user/myapp.sh restart'
Se isso não funcionar, tente definir a variável de caminho no crontab
fonte
Meu jeito de lidar com isso era o seguinte:
1) Colocando minhas variáveis (no final de)
~/.profile
:2) Criando um script Bash para minhas tarefas cron (diárias) (
~/cronDaily.sh
) contendo meus comandos, além de fornecimento repetitivo de~/.profle
:3) agendar a execução do meu script a partir
crontab
da execução diária:Minha variável não foi ignorada e os comandos foram executados com sucesso.
Alguns podem dizer que esse fornecimento intenso
~/.profile
é problemático. No meu caso particular, não vejo por que isso é um problema, mas aconselho a criação de um arquivo dedicado para isso.Em geral, pode haver uma maneira melhor de fazer isso, mas foi isso que funcionou para mim depois de muita dor e explica o princípio de que, no Bash 4.3.46, você não pode obter um arquivo
crontab
.fonte