关于 at 的问题

关于 at 的问题

我尝试使用 at 来安排在特定时间运行的作业。我有一台 Mac 电脑。例如,我尝试在终端中通过以下 at 来测试这一点:

at now + 1 minute
echo 'Test at'
<EOD>

过了一分多钟,我还是没有看到回显。输入以下命令后:

at -l

我没有看到任何作业,但我收到消息说我有一封邮件。我通过邮件命令转到我的邮件。我确实看到了一条消息,然后我输入了 1。我看到我的作业输出在邮件中。

我的第一个问题是,我不确定这是否是 at 命令的默认行为。有没有办法改变这种行为,以及如何改变它以将结果指向可能的位置。

我的理解是,如果我的计划作业有任何消息,输出消息将被发送回我的邮件。我的下一个相关问题是,我不确定计划作业在哪里运行?在后台?我无法使用 fg 或 bg 命令找到它。

答案1

这确实是如所述男人

如果有命令,用户将收到标准错误和标准输出。邮件将使用命令 sendmail(8) 发送。如果从 su(1) shell 执行 at,则登录 shell 的所有者将收到邮件。

对于不同的行为,你可以调用像这样:

$ at now + 1 minute 
$ echo "test at" > /dev/ttys000
$ <EOD>

这会将 STDOUT 重定向到终端 ttys000。您需要替换/dev/ttys000与您的终端对应的设备文件,您可以通过运行以下命令来确定:

$ tty

计划任务在它们自己的 shell 中执行(参见男人了解详细信息),这样 bg 就不会列出它们。要查看计划任务列表,您可能需要尝试陣容或者在-l

答案2

是的,向调用 at 命令的用户发送邮件是默认行为。

从 at 手册页中:

由于命令在单独的 shell 调用中运行,在没有控制终端的单独进程组中运行,因此从调用环境继承的打开的文件描述符、陷阱和优先级都会丢失。

由于上述原因,没有简单的方法来传达命令的输出。当然,您可以将输出重定向到文件,或使用替代机制来传达输出,作为命令的一部分。

如果您没有看到计划的作业,那是因为系统上运行着一个 atd 守护进程,它接收并执行 at 作业。在 Mac 上,这些作业可能由启动守护进程是 Apple 的一体化替代守护进程:

launchd 守护进程本质上是 init、rc、init.d 和 rc.d 脚本、SystemStarter (Mac OS X)、inetd 和 xinetd、atd、crond 和 watchdogd 的替代品。Apple 已声明打算取消上述所有服务,转而使用 launchd

相关内容