我是一个相对的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)
我看到的唯一输出是,例如:
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
是否在警告中找到了我的问题的答案?如果是这样,/bin/sh与标准输出有何不同?
use*_*ser 19
因为at不在您登录的用户会话的上下文中执行命令。这个想法是,您可以安排一个命令在任意时间运行,然后注销,系统将负责在指定时间运行该命令。
请注意,手册页at(1)特别说明(我的重点):
用户将收到来自他的命令的标准错误和标准输出(如果有)。将使用命令 /usr/sbin/sendmail 发送邮件。
所以你应该检查你的本地邮件池,或者,如果失败了,本地系统邮件日志。/var/spool/mail/$USER 可能是一个不错的起点。
另请注意,“Started”和“Finished”源自外部脚本,它们本身与根本无关at。你可以at去掉它们或调用,你会得到基本相同的结果。
正如@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)
我们在邮件队列的“收件箱”中有这个:

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

它奏效了。
我正在运行 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”将出现在您的终端中...