BASH_ENV e cron jobs

5

Eu tenho várias perguntas relacionadas a shells não-interativos, não-login e trabalhos agendados.

Q1. Eu li que shells não interativas e sem login apenas "load" $BASH_ENV .  O que isso significa exatamente? Isso significa que posso apontar $BASH_ENV para um arquivo e que esse arquivo será originado?

Q2 : Supondo que eu tenha uma entrada em cron apontando para um script Bash com um Bash shebang, com quais variáveis e definições de ambiente posso assumir que meu script Bash está carregado?

Q3 : se eu adicionar SHELL=/bin/bash ao topo do meu crontab , o que exatamente isso faz? Isso significa que:

  1. cron é executado no Bash?
  2. Os comandos especificados em crontab são interpretados no Bash?
  3. Os scripts que não têm shebangs , são executados em $SHELL

alguma outra coisa?

Q4 : como posso definir BASH_ENV para trabalhos agendados?

    
por Amelio Vazquez-Reina 19.05.2014 / 15:19

1 resposta

4

Para Q1 e amp; Q2, consulte aqui . O terceiro trimestre é respondido na discussão de suas outras três perguntas abaixo.

WRT $BASH_ENV , de man bash :

When bash is started non-interactively, to run a shell script, for example, it looks for the variable BASH_ENV in the environment, expands its value if it appears there, and uses the expanded value as the name of a file to read and execute.

Portanto, este pode ser um script .profile type. Quanto a onde ou quem o define, isso depende do contexto - geralmente não está definido, mas poderia ter sido por qualquer ancestral do processo atual. cron parece não fazer uso especial disso, e o AFAIK também não faz o init.

Does it mean that cron itself runs in Bash?

Se por "in" você quer dizer, é iniciado a partir de um shell, então isso depende do sistema init - por exemplo, o SysV executa scripts de shell para serviços, então esses serviços são sempre iniciados através de um shell.

Mas se por "in" você quer dizer, "É assim um filho de um processo de shell?", não. Como outros daemons ele é executado como o líder de seu próprio grupo de processos e seu pai processo é o processo init (pid 1).

As conseqüências para o ambiente de cron são provavelmente irrelevantes, no entanto. Para saber mais sobre o ambiente de serviços de inicialização, consulte a resposta vinculada acima, referente a Q1 & Q2 WRT para cron especificamente, de acordo com man 5 crontab , também define algumas variáveis de ambiente que são herdadas por qualquer processo iniciado ( $LOGNAME , $HOME e $SHELL ).

The commands specified in crontab are interpreted in Bash?

Eles são interpretados com sh ou $SHELL ; novamente a partir de man 5 crontab :

The entire command portion of the line, up to a newline or a "%" character, will be executed by /bin/sh or by the shell specified in the SHELL variable of the cronfile. A "%" character in the command, unless escaped with a backslash (), will be changed into newline characters, and all data after the first % will be sent to the command as standard input.

A parte enfatizada responde a Q3.

The scripts that do not have shebangs in them, are run using $SHELL

Scripts executáveis com ou sem shebangs são abertos por $SHELL (ou sh ). A diferença é que aqueles com um shebang serão então entregues ao intérprete apropriado ( #!/bin/sh sendo outra instância do shell), enquanto scripts executáveis (aqueles com o conjunto de bits executável que são referência como executáveis) ) sem um shebang simplesmente falhará, da mesma forma que quando executados a partir da linha de comando (a menos que você execute sh script.sh ).

    
por 19.05.2014 / 15:46