como definir a variável crontab PATH

17

Eu tive um problema ao executar um script do crontab. Após algumas pesquisas, entendi que o problema era porque o parâmetro PATH não inclui / sbin.

Eu olhei o que ele inclui no / etc / crontab:

PATH=/sbin:/bin:/usr/sbin:/usr/bin

Como teste - tarefa cron simples para imprimir a variável PATH:

* * * * * echo $PATH &> /root/TMP.log

a saída é:

cat /root/TMP.log
/usr/bin:/bin

Eu não entendo esse comportamento ... Como faço para definir a variável PATH ..? Ou melhor - como adicionar caminhos a ele?

csny
fonte

Respostas:

17

Enquanto eles são semelhantes, um usuário crontab (editado usando crontab -e) é diferente e mantém um caminho separado do sistema crontab (editado editando / etc / crontab).

O crontab do sistema possui 7 campos, inserindo um nome de usuário antes do comando. O usuário crontab, por outro lado, possui apenas 6 campos, entrando diretamente no comando imediatamente após os campos de hora.

Da mesma forma, o PATH no sistema crontab normalmente inclui os diretórios / sbin, enquanto o PATH no usuário crontab não. Se você desejar definir PATH para o usuário crontab, precisará definir a variável PATH no usuário crontab.


Uma solução simples para adicionar seus comandos PATH regulares no shell no cron é ter a origem do cronjob no seu perfil executando o bash no shell de logon. por exemplo, em vez de

* * * * * some command

Você pode executar

* * * * * bash -lc some command

Dessa forma, se o seu perfil definir o PATH ou outras variáveis ​​de ambiente para algo especial, ele também será incluído no seu comando.

madumlao
fonte
Obrigado, isso explica ... Mas desta forma, só posso definir o PATH, e não editar, porque PATH = / sbin: $ PATH ou similar não funciona. Eu tentei ...
csny
Sim, você precisaria definir o PATH do zero em um caso como este, o que deve ser bastante fácil, pois você conhece todos os comandos que são executados no seu crontab, portanto, basta levar em consideração.
feijão
@madumlao bash -lcnão ajuda. Por enquanto, sou bom em configurar o PATH manualmente, mas se eu instalar alguns scripts, quero que eles sejam reconhecidos nos cronjobs sem especificar caminhos completos. Tenho certeza de que é possível alguma forma, e bash -lcestá a caminho a uma solução :)
csny
4
O bash -lc inicia um shell de login que origina o perfil do usuário. Isso significa que ele usa o PATH definido em ~ / .bash_profile, ~ / .profile ou ~ / .bashrc ... você tem o caminho definido lá? Se assim for e funciona mal atualizar a minha resposta para isso
madumlao
Ótimo. Obrigado Madunlao. Depois de adicionar manualmente a pasta bin file ao ~ / .bash_profile, meu cronjob funciona bem.
张健健
8

Se você precisar de PATHs padrão do sistema e outras variáveis ​​ENV (definidas em /etc/profile.d), basta colocar o seguinte:

* * * * * . /etc/profile; your cmd
Vladislav Savchuk
fonte
3

É possível definir o PATH (ou outros parâmetros) na linha cronjob ou em uma única linha. Mas você não é capaz de usar a expansão do shell como PATH=$PATH:/usr/local/bin. Mas o til é permitido para atalhos do diretório inicial.

Dos livros:

Uma linha ativa em um crontab é uma configuração de ambiente ou um comando cron. Uma configuração de ambiente é da seguinte forma: name = value em que os espaços em branco ao redor do sinal de igual (=) são opcionais e quaisquer espaços em branco não principais subsequentes no valor fazem parte do valor atribuído ao nome. A cadeia de valor pode ser colocada entre aspas (simples ou dupla, mas correspondente) para preservar os espaços em branco iniciais ou finais.

Veja man 5 crontabpara mais informações.

Portanto, isso deve funcionar:

PATH=/bin:/usr/bin:/my/path/bin
5 3 * * * command_that_requires_my_path
itsafire
fonte
0

Eu tive o mesmo problema e encontrei outra maneira de executar meu script no crontab. Eu acho que a maneira mais fácil de executar o seu programa é criar um script que possa entrar no diretório do seu programa. Em seguida, chame seu programa nesse script.

Este é um exemplo de script (nome do script = launcher.sh):

#!bin/bash
cd /home/pi/test
sudo python3 example.py

então, torne seu script executável:

chmod 755 launcher.sh

E, finalmente, adicione seu script ao crontab

crontab -e

e adicione esta linha no final:

@reboot sh /home/pi/test/launcher.sh

(Defino o programa para ser executado a cada reinicialização)

Reyhaneh Trb
fonte