Como usar o crontab para iniciar scripts

0

Eu criei um script (que eu já testei se funciona) e eu quero usar o crontab para lançá-lo toda vez que meu PC for reinicializado.

Eu criei esse script chamado test.sh apenas por diversão e é muito fácil:

#!/bin/bash
while true; do
echo "HELLO WORLD!"
done

Ele apenas imprime "Hello World" até que alguém use ctrl + c, ele está localizado no diretório / home / myuser / Scripts.

Por isso eu abro crontab -e e adiciono

@reboot /home/myuser/Scripts/test.sh

Eu reinicio a máquina, mas nada acontece, enquanto se eu iniciar manualmente o script, descompactando ./test.sh, isso simplesmente funciona.

Eu não sei o que está errado ...

Poderia, por favor, me ajudar?

    
por OverMorrow 22.05.2016 / 17:57

2 respostas

2

O cronjob pode muito bem estar em execução - no entanto, você não forneceu nenhum redirecionamento de sua saída (stdout), portanto, não tem onde ser exibido. As tarefas lançadas pelo cron são responsáveis por seus próprios registros / saídas - o cron não fornece capacidade de redirecionamento de saída.

Você pode fazer com que a tarefa cron ative um terminal e, em seguida, execute seu script nele; aqui está um exemplo disso:

Primeiro crontab de configuração com crontab -e (executando como usuário que você quer que o script seja executado).

Adicione um trabalho da maneira padrão; Eu estou tendo este executado a cada minuto para fins de teste:

* * * * * /home/argonauts/scripts/test.sh

No seu script, você precisa definir explicitamente a exibição e iniciar o terminal. Aqui está o que eu usei para test.sh:

#!/bin/bash
DISPLAY=:0 xterm -hold -e bash -c "while true; do echo Hello World!; done"  &
DISPLAY=:0 konsole --noclose -e bash -c "/home/argonauts/scripts/test2.sh" &

O primeiro comando inicia uma janela xterm executando seu loop Hello World. O argumento -hold mantém a janela aberta após o comando ser executado (o que suponho neste caso particular é quando verdadeiro == falso ...).

O segundo comando lança um terminal konsole e executa um segundo script dentro dele. Para verificar o contexto, usei este pequeno script de teste test2.sh . --noclose é o equivalente a -hold

do xterm
#!/bin/bash
echo "This is 'basename $0'"

Em terra 'cron', tenha em mente que existe uma visibilidade muito limitada ao seu ambiente normal de shell. Adicione o comando env a um script chamado pelo cron para ver a que ele tem acesso. Você normalmente precisará usar caminhos completos para tudo, incluindo coisas em / bin /. Também pode ser padrão para sh em vez de bash , portanto, seja explícito ao qualificar o shell a ser usado. O sh é normalmente bash na maioria das distribuições atualmente, mas é chamado em um modo de compatibilidade que pode quebrar muitas coisas.

Se você está depurando um cronjob, veja em / var / log / cron para detalhes se eles estão rodando e quaisquer erros. Você também deve verificar o serviço usando systemctl status crond para garantir que ele esteja em execução e não em estado de falha. Por fim, journalctl e / var / log / messages contêm informações sobre os cronjobs à medida que são executados.

E, obviamente, mude a programação * * * * * em crontab para @reboot, uma vez feito o teste.

Há também um recurso muito (editar - esqueci um adjetivo) semelhante no systemd usando temporizadores. É uma sintaxe um pouco complicada, e por padrão será executada como root, mas caso você esteja curioso: link

    
por 22.05.2016 / 19:27
2

Como você sabe que "nada acontece"? Só porque o script não aparece em uma janela na tela, não significa que não esteja sendo executado.

O Cron é feito para tarefas "em lote", não para iniciar programas interativos, então não apenas ele não lançará automaticamente uma janela de terminal para você (embora isso possa ser feito manualmente), a maioria o tempo em que não pode lançar qualquer aplicativo gráfico, pois não sabe qual sessão X ele deve usar.

(Na verdade, o cron geralmente executa as tarefas @reboot muito antes de o Xorg inicializar os gráficos ainda ...)

Isso significa que a saída das tarefas do cron vai para outro lugar - no momento provavelmente está inundando o log do sistema (journalctl, ou / var / log / syslog, ou algo assim) com infinitamente muitos 'Hello World'.

Alternativamente, o cron pode enviar a saída do trabalho por e-mail se o sistema tiver configurado (geralmente em servidores). No entanto, isso só acontece quando o trabalho é concluído (e seu script de exemplo nunca termina).

Se você quer rodar algo que apareceria na tela, existem mecanismos para fazer isso no login (não no boot):

  • Provavelmente, você pode colocar ~/Scripts/test.sh & no arquivo ~/.xprofile . Isso geralmente funciona, mas depende de qual gerenciador de exibição o sistema usa.

  • Outro método é criar um ~/.config/autostart/my-test-script.desktop :

    [Desktop Entry]
    Name=my test script
    Type=Application
    Exec=/home/myuser/Scripts/test.sh
    Terminal=yes
    
por 22.05.2016 / 18:14