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
#!/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