我在 Ubuntu 20 中提交批处理作业。
at now -f myscript.sh
作业完成后,我会收到一封包含日志的电子邮件。但对于一项耗时的工作,我希望看到执行过程中的进展。我怎样才能做到这一点?
答案1
这将非常冗长,但是如果您将 -x 添加到 myscript.sh 第一行的 shell 中,它将显示脚本的逐行执行。输出将通过电子邮件发送给提交作业的用户,并且也会出现在 cron 日志中。
例如,#!/bin/sh -x 而不是 #!/bin/sh
当作业正在进行时,只需 tail -f cron 日志即可查看进度。提醒一下,这会产生大量的日志数据!您可能会选择修改脚本以某种方式显示进度? echo“拆解完成,开始安装xxx”
答案2
该at
工具捕获进程的标准输出,然后将其作为日志发送。因此,如果不对日志进行重大更改,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
.它允许将标准输出复制到文件中。这反过来又可以帮助在脚本中重复打印日志消息。
#!/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