为什么这个“at”命令不打印到标准输出?

And*_*rew 15 output at

我是一个相对的Linux新手。我正在尝试学习如何使用,at以便我可以安排任务稍后开始,而无需使用sleep. 我一直在看这个以前的问题寻求帮助。

我的问题是,在我创建的以下示例 bash 脚本中,为什么“运行”永远不会——据我所知——打印到标准输出(即我的 bash 控制台)?

#!/bin/bash

echo "Started"

at now + 1 minutes <<EOF
echo "Running"
EOF

echo "Finished"
Run Code Online (Sandbox Code Playgroud)

我看到的唯一输出是,例如:

Started
warning: commands will be executed using /bin/sh
job 3 at Fri Jul 12 17:31:00 2013
Finished
Run Code Online (Sandbox Code Playgroud)

是否在警告中找到了我的问题的答案?如果是这样,/bin/sh与标准输出有何不同?

use*_*ser 19

因为at不在您登录的用户会话的上下文中执行命令。这个想法是,您可以安排一个命令在任意时间运行,然后注销,系统将负责在指定时间运行该命令。

请注意,手册页at(1)特别说明(我的重点):

用户将收到来自他的命令的标准错误和标准输出(如果有)。将使用命令 /usr/sbin/sendmail 发送邮件。

所以你应该检查你的本地邮件池,或者,如果失败了,本地系统邮件日志。/var/spool/mail/$USER 可能是一个不错的起点。

另请注意,“Started”和“Finished”源自外部脚本,它们本身与根本无关at。你可以at去掉它们或调用,你会得到基本相同的结果。


slm*_*slm 8

正如@MichaelKjörling 所解释的那样,您的at工作产生的任何输出都将被捕获并通过电子邮件发送给您。如果您的盒子上没有正在运行的MTA - 邮件传输代理,则电子邮件可能处于不确定状态,您at甚至不会知道它正在尝试这样做。

MTA 是一种程序,例如sendmail或postfix可以将电子邮件“发送”到适当的目的地。在这种情况下,它将把它传送到/var/spool/mail本地系统上的邮件队列(目录下的一个文件)。系统上的每个用户都可以在此目录中拥有一个队列。

在我的 Fedora 系统上,如果我启动了sendmail本地邮件传递就可以了。不过我通常把它关掉。

$ sudo service start sendmail
Run Code Online (Sandbox Code Playgroud)

现在我们可以看到我的用户帐户的邮件队列saml是空的:

$ ll /var/spool/mail/|grep saml
-rw-rw----. 1 saml mail       0 Jul 12 19:33 saml
Run Code Online (Sandbox Code Playgroud)

所以现在我们运行这个at工作:

$ at now + 1 minutes <<EOF
echo "Running"
EOF
job 96 at Fri Jul 12 19:38:00 2013
Run Code Online (Sandbox Code Playgroud)

我们可以看到作业正在等待运行atq:

$ atq
96  Fri Jul 12 19:38:00 2013 a saml
Run Code Online (Sandbox Code Playgroud)

几分钟后再次运行它,我们可以看到at作业已完成:

$ atq
$
Run Code Online (Sandbox Code Playgroud)

顺便说一句,随着我的 MTA 运行,我现在在我的终端中收到此消息:

您在 /var/spool/mail/saml 中有新邮件

所以让我们检查一下:

$ ll /var/spool/mail/|grep saml
-rw-rw----. 1 saml mail     651 Jul 12 19:38 saml
Run Code Online (Sandbox Code Playgroud)

是的,我们收到了邮件,所以让我们使用mutt以下命令检查一下:

$ mutt -f /var/spool/mail/saml
Run Code Online (Sandbox Code Playgroud)

我们在邮件队列的“收件箱”中有这个:

     mutt 收件箱的 ss

让我们看看这封电子邮件:

     ss of mutt 的 msg

它奏效了。


AAA*_*lub 6

我正在运行 Debian 8.1 (jessie)
您可以使用 tty 将“at”输出发送到终端。

$ tty
/dev/pts/1

$ at now + 1 min
warning: commands will be executed using /bin/sh
at> echo 'ZZZZZ' > /dev/pts/1
at> <EOT>
Run Code Online (Sandbox Code Playgroud)

一分钟后,“ZZZZZ”将出现在您的终端中...