Eu envio o trabalho em lote no Ubuntu 20.
at now -f myscript.sh
Recebo um e-mail com um registro quando o trabalho é concluído. Mas para um trabalho demorado, gostaria de ver progresso durante a execução. Como eu posso fazer isso?
Responder1
Isso será muito detalhado, no entanto, se você adicionar -x ao shell na primeira linha de myscript.sh, ele mostrará a execução linha por linha do seu script. A saída seria enviada por e-mail para o usuário que envia o trabalho e também estaria presente no cron log.
Exemplo, #!/bin/sh -x em vez de #!/bin/sh
Enquanto o trabalho está em andamento, basta seguir o cron log e você poderá observar o progresso. Lembrete: isso produzirá muitos dados de registro! Você pode optar por modificar seu script para mostrar o progresso ao longo do caminho de alguma forma? echo "concluída a desmontagem, iniciando a configuração de xxx"
Responder2
A at
ferramenta captura stdout do processo e depois o envia como log. Portanto, sem alterações significativas, at
não é possível ler o log conforme está escrito.
Mas você pode fazer uma solução alternativa com um segundo log. Basta imprimir o log de 'progresso' no arquivo com um nome conhecido. Depois disso, você pode tail -f
fazer isso se quiser ou ignorar.
Em outras palavras, o script que você executa at
seria algo como:
#!/bin/sh
echo Started at `date`
echo Started at `date` > /var/myscript.log
some_long_running_process_with_log >> /var/myscript.log
rc=$?
echo Completed at `date` with return code $rc
echo Completed at `date` with return code $rc >> /var/myscript.log
Neste caso, você teria um log curto (com apenas duas linhas) para at
enviar por e-mail, e todo o log da parte interna de longa execução.
Como extensão desta abordagem você pode usar o tee
. Permite duplicar o stdout no arquivo. O que por sua vez pode ajudar na duplicação da impressão de mensagens de log no script.
#!/bin/sh
echo Started at `date` | tee /var/myscript.log
some_long_running_process_with_log >> /var/myscript.log
rc=$?
echo Completed at `date` with return code $rc | tee -a /var/myscript.log