Execute o script em um shell não interativo?

15

Eu tenho um cron job que está executando um script. Quando eu executo o script através de um shell interativo (ssh'ed para bash) ele funciona bem. Quando o script é executado por conta própria, o cron falha.

Meu palpite é que ele está usando algumas das variáveis ambientais definidas no shell interativo. Vou solucionar o script e removê-lo.

Depois de fazer alterações, sei que poderia colocar o script no cron na fila para que ele seja executado normalmente, mas existe uma maneira de executar o script a partir da linha de comando, mas avisá-lo para executar como seria do cron - ou seja, em um ambiente não interativo?

    
por cwd 03.11.2011 / 14:07

6 respostas

12

As principais diferenças entre executar um comando do cron e rodar na linha de comando são:

  • o cron provavelmente está usando um shell diferente (geralmente /bin/sh );
  • o cron está sendo executado em um ambiente pequeno (quais dependem da implementação do cron, portanto, verifique a página cron(8) ou crontab(5) man; geralmente há apenas HOME , talvez SHELL , talvez LOGNAME , talvez USER e um pequeno PATH )
  • o cron trata o caractere % especialmente (ele é transformado em uma nova linha);
  • as tarefas do cron são executadas sem um terminal ou ambiente gráfico.

A invocação a seguir irá executar o trecho de código, como se fosse invocado pelo cron. Presumo que o fragmento não contenha os caracteres ' ou % .

env - HOME="$HOME" USER="$USER" PATH=/usr/bin:/bin /bin/sh -c 'shell snippet' </dev/null >job.log 2>&1

Veja também executando um script sh do cron , o que pode ajudar a resolver seu problema.

    
por 04.11.2011 / 00:21
2

Do link @ sr_ ( Como obter um ambiente limpo em um shell ksh? ), eu olhei para env, e você pode querer tentar isso:

env -i ./my-script.sh
    
por 20.12.2011 / 23:55
1

Eu sugiro que você use caminhos absolutos para seus scripts ao colocá-lo no cron e usar em outro lugar e para qualquer e todos os comandos linux usados nele, melhor declará-los como variáveis e usá-lo!

    
por 03.11.2011 / 16:22
0

O Cron não usa necessariamente o mesmo shell que você está usando. verifique:

cat /etc/crontab |grep SHELL

Para determinar o shell e tentar executar o seu script - isso funciona? Esta é uma causa comum de problemas para muitas pessoas que adicionam scripts ao cron.

Se este é o problema - você pode adicionar "bash" ao início do seu script no cron para forçar este script a ser executado no bash. Se isso não resolver o problema, me avise e eu vou cavar um pouco mais.

    
por 03.11.2011 / 20:21
0

Se você quiser ignorar algumas perguntas interativas fornecidas por algum script, tente:

yes | your_command

Ou yes "n" se você gostaria de Não todas as perguntas.

Command:

yes -- be repetitively affirmative yes outputs expletive, or, by default, 'y', forever.

    
por 04.09.2013 / 18:35
0

Para executar seu script em um shell não interativo (sem considerar os detalhes de cron ), você pode fazer isso via ssh .

Teste se você realmente acabar em um shell não interativo:

> ssh someuser@somehost tty
not a tty

Execute o script em um shell não interativo:

> ssh someuser@somehost /tmp/myscript.sh
    
por 03.10.2018 / 08:35