![为什么通过 at 调用 dzen2 时不工作?](https://linux22.com/image/22964/%E4%B8%BA%E4%BB%80%E4%B9%88%E9%80%9A%E8%BF%87%20at%20%E8%B0%83%E7%94%A8%20dzen2%20%E6%97%B6%E4%B8%8D%E5%B7%A5%E4%BD%9C%EF%BC%9F.png)
dzen2是一种通知实用程序。此命令将在屏幕上显示“Hi”的通知:
echo Hi | dzen2 -p
Debian 的在是一个安排未来发生的事件的实用程序。此命令将使文件“foo”在 1 分钟后出现在您的用户目录中:
echo "touch ~/foo" | at now + 1 minute
那么为什么这个命令dzen2
在 1 分钟后没有出现通知呢?
echo "echo Hi | dzen2 -p" | at now + 1 minute
我已经调查了几个小时,似乎找不到这不起作用的原因!我有一种预感,它与 at 调用的 shell 有关,但我只是不明白为什么它会失败。作为对位示例,此命令运行良好:
echo "notify-send Hi" | at now + 1 minute
答案1
构成该作业的程序at
是atd
(位于守护进程) 进程,而不是您运行的 shell 的进程at
。所以它不会继承当前 shell 的环境。系统at
安排复制环境(以及工作目录和一些更晦涩的东西),但它省略了一些变量。
特别是,该DISPLAY
变量不会复制到 at 作业中。该变量告诉所有 X 程序要连接到哪个显示器。如果没有 X 显示,dzen2 就不知道在哪里弹出通知。 At 会被删除,DISPLAY
因为它通常用于批处理作业,不会产生任何终端或图形输出。
notify-send
有效是因为它没有连接到 X 服务器:它使用D总线连接到附加到 X 会话的守护程序。
您可以通过显式复制变量来使 dzen2 工作DISPLAY
:
echo "export DISPLAY=$DISPLAY;" 'echo hello | dzen2 -p' | at now + 42 minutes
dzen2 可能会产生错误消息(标准消息是Can't open display:
)。 at 作业产生的任何输出或错误消息都通过本地邮件发送(与 cron 作业完全相同)。检查您本地的邮件。