在完成之前查看 `at` 输出

在完成之前查看 `at` 输出

假设我at在 Linux 上运行一个脚本(见下例),我知道这个脚本需要几个小时,甚至几天的时间。我习惯在at命令完成后发送一封包含命令输出的电子邮件,但如果我想查看当前输出,该怎么办它完成了吗?我们还假设我已经运行了脚本,但忘记使用 或其他类似方法重定向输出,tail并且tee不想停止脚本。有什么办法吗?

drew@anubis:~$ at now
warning: commands will be executed using /bin/sh
at> ./myscript.sh
at> <EOT>
job 3 at Sat Jan  7 09:31:00 2017

答案1

如果作业已启动,并且您可以通过某种方式获取该作业的 PID,则可以看到at保存输出的位置:

$ at now
warning: commands will be executed using /bin/sh
at> sleep 10m
at> <EOT>
job 7 at Sat Jan  7 20:18:00 2017
$ pgrep sleep
7582
$ ls -l /proc/7582/fd
total 0
lr-x------ 1 muru muru 64 Jan  7 20:19 0 -> /var/spool/cron/atjobs/a0000701795998 (deleted)
lrwx------ 1 muru muru 64 Jan  7 20:19 1 -> /var/spool/cron/atspool/a0000701795998
lrwx------ 1 muru muru 64 Jan  7 20:19 2 -> /var/spool/cron/atspool/a0000701795998

如您所见,输出已保存到临时文件中,您现在可以检查:

$ sudo tail -f /var/spool/cron/atspool/a0000701795998
Subject: Output from your job        7
To: muru

您需要这样做,sudo因为包含的目录不是全世界可访问的(至少在 Ubuntu 14.04 上):

$ sudo namei -lx /var/spool/cron/atspool/a0000701795998
f: /var/spool/cron/atspool/a0000701795998
Drwxr-xr-x root     root   /
drwxr-xr-x root     root   var
drwxr-xr-x root     root   spool
drwxr-xr-x root     root   cron
drwxrwx--T daemon   daemon atspool
-rw------- muru     muru   a0000701795998

答案2

确定哪个假脱机文件属于您的作业的另一种方法是从中获取作业编号atq

drew@sokar:~$ atq
38      Tue Jul 10 12:15:00 2018 = drew

将作业编号转换为十六进制。例如 38(十进制)= 26(十六进制)。

drew@sokar:~$ printf "%x\n" 38
26

您的文件将被命名为队列字母(99% 的时间都是a),后跟 5 位十六进制作业 ID(我通过查看命令的源代码了解到这一点at)。

drew@sokar:~$ sudo ls -l /var/spool/cron/atspool
total 55968
-rw------- 1 drew drew       49 Feb 16  2017 a0001c017a3cb2
-rw------- 1 drew drew 57297586 Feb 26  2017 a0001e017a7405
-rw------- 1 drew drew     2329 Jul 10 12:21 a0002601856a0f
                                              -----

然后你可以查看 stdout

drew@sokar:~$ sudo less /var/spool/cron/atspool/a0002601856a0f

相关内容