Como iniciar comandos crontab dentro de certas sessões de tela?

3

Eu tenho um crontab que funciona assim:

0 0 * * * /execute/shell/script.sh
0 0 * * * /execute/shell/script1.sh
0 0 * * * /execute/shell/script2.sh

Eu quero lançar cada script em uma tela diferente. Mas quero manter essa tela em execução para que, sempre que eu quiser ver o progresso de um desses scripts, eu sempre possa fazer o screen -d -r <PID> e ele reconecte a tela para que eu possa ver o progresso.

Tenho certeza de que deve haver uma maneira de fazer isso. mas as perguntas similares que encontrei não foram respondidas.

Crontab inicia uma tela Como uso o crontab para iniciar uma sessão de tela?

    
por Hunle 01.09.2017 / 02:09

3 respostas

2

Você realmente tem que interagir com os comandos, ou você apenas quer ver o status antes dos comandos serem completados, e os resultados são enviados de volta para você?

Encontrei um "problema" semelhante, em que estava executando traceroute(8) e mtr de dentro do cron, para monitorar a conectividade, com mtr sendo executado em for -loop para fornecer medições mais precisas em um determinado intervalo ( entre 5 e 16,67 minutos (300 a 1000 ciclos)), mas todo o script foi projetado para funcionar por cerca de uma hora (para garantir que eu não receba spam de e-mails), então, eu queria poder ver o status como aconteceu.

link

A maneira como cron funciona é que cria um arquivo temporário em / tmp e chama imediatamente unlink(2) (mas ainda mantendo o arquivo aberto); isso é usado subseqüentemente para armazenar a saída dos seus scripts antes que eles terminem, e eles são enviados por e-mail para você.

Assim, você pode usar lsof -n -c cron (e / ou lsof -n | fgrep cron ) para descobrir o número de arquivos abertos que foram excluídos e, em seguida, acessar esses arquivos pelo namespace /proc/$PID/fd/$FD para ver a saída de seu arquivo. scripts em execução no cron, sem necessidade de screen .

    
por 12.09.2017 / 00:23
2

Você pode tentar algo assim:

cat /etc/cron.d/test
*/10 * * * * root screen -dmS script bash -c '/execute/shell/script.sh; exec bash'
*/10 * * * * root screen -dmS script1 bash -c '/execute/shell/script1.sh; exec bash'
*/10 * * * * root screen -dmS script2 bash -c '/execute/shell/script2.sh; exec bash'

Deve funcionar, eu acredito. Claro, edite os horários para o que você precisar.

    
por 12.09.2017 / 14:16
1

O acima (resposta de Jaroslav Kucera) não funcionará como pretendido porque na segunda chamada os comandos gerarão novas sessões de tela com os mesmos nomes que os anteriores.

Se você quiser ter sempre as mesmas sessões de tela para os mesmos scripts, então eu faria isso um pouco mais complicado.

Eu executaria essas sessões no @reboot cron com scripts que fazem um loop constante como

#!/bin/bash
while true; do
if [ -f /tmp/script1_enabled ]; then
    script1_function_or_command
    rm /tmp/script1_enabled
fi

sleep 60;
done 

O qual executaria cada minuto verificando a presença do arquivo nomeado em / tmp - se existir, então execute o comando, caso contrário, espere outro minuto.

A segunda parte seria os comandos cron que criariam esses arquivos todos os dias - funcionando como um sinalizador booleano para iniciar a invocação do script.

Após o script ser concluído, o arquivo será removido. Dessa forma, você pode manter as mesmas sessões para seus scripts e ainda executá-las em intervalos de sua preferência.

Se o atraso de 60 segundos no loop for demais para você (não há como executar precisamente o script em determinado momento com esse método, pois o sono será executado em um horário imprevisível), você pode configurar inotifywait observa e executa scripts assim que o arquivo é criado.

o cron ficaria assim:

@reboot screen -dmS script1 /usr/local/bin/script1_watcher
@reboot screen -dmS script2 /usr/local/bin/script2_watcher
0 0 * * * touch /tmp/script1_enabled
15 */4 * * * touch /tmp/script2_enabled
    
por 14.09.2017 / 00:02