Я отправляю пакетное задание в Ubuntu 20.
at now -f myscript.sh
Я получаю письмо с журналом, когда работа завершена. Но для работы, требующей много времени, я хотел бы видеть прогресс в ходе выполнения. Как это сделать?
решение1
Это будет очень многословно, однако, если вы добавите -x к оболочке в первой строке myscript.sh, он покажет вам выполнение вашего скрипта построчно. Вывод будет отправлен по электронной почте пользователю, отправившему задание, а также будет представлен в журнале cron.
Пример, #!/bin/sh -x вместо #!/bin/sh
Пока работа выполняется, просто выполните tail -f в журнале cron, и вы сможете наблюдать за ходом выполнения. Напоминаем, что это создаст много данных журнала! Вы можете изменить свой скрипт, чтобы каким-то образом показывать ход выполнения? echo "finished teardown, beginning setup of xxx"
решение2
Инструмент at
захватывает stdout процесса, а затем отправляет его в виде журнала. Поэтому без существенного изменения at
невозможно прочитать этот журнал в том виде, в котором он написан.
Но вы можете обойти это с помощью второго журнала. Просто распечатайте журнал «прогресса» в файле с известным именем. После этого вы можете tail -f
его использовать, если хотите, или проигнорировать.
Другими словами, скрипт, который вы запустите, at
будет выглядеть примерно так:
#!/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
В этом случае у вас будет короткий журнал (всего из двух строк), который можно at
отправить вам по почте, и весь журнал из длинной внутренней части.
В качестве расширения этого подхода можно использовать tee
. Он позволяет дублировать stdout в файл. Что в свою очередь может помочь с дублированием вывода сообщений журнала в скрипте.
#!/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