为什么通过 at 调用 dzen2 时不工作?

为什么通过 at 调用 dzen2 时不工作?

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

构成该作业的程序atatd(位于守护进程) 进程,而不是您运行的 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 作业完全相同)。检查您本地的邮件。

相关内容