在所有正在运行的 X 显示器上显示通知

Ste*_*fan 19 command-line xorg notifications tty console

使用命令行,我想在每个正在运行的 X 显示器上显示通知。(和运行控制台)

就像是:

notify-send-all 'Warning' 'Nuclear launch in 5 minutes, please evacuate'
Run Code Online (Sandbox Code Playgroud)

有没有程序可以做到这一点?如果没有,这可以用bash实现吗?

fsc*_*itt 17

您可以使用命令墙向所有控制台发送消息。

为了在 X 下发送通知,可以使用 notify-send 向当前显示器上的当前用户发送通知。(根据您的问题,我猜您已经知道了这个。)您可以使用一些 bash 脚本在此基础上进行构建。基本上,您必须找出哪些用户使用哪些 X-Display。获得此信息后,您可以像这样使用通知发送:

DISPLAY=:0 sudo -u fschmitt notify-send "Message"
Run Code Online (Sandbox Code Playgroud)

其中 fschmitt 是显示 0 处的用户。您可以解析“who”命令的输出以查找所有用户及其显示。输出看起来像这样

[edinburgh:~]$ who
markmerk3 tty7         2010-09-23 10:59 (:0)
markmerk3 pts/1        2010-09-30 13:30 (:0.0)
fschmitt pts/2        2010-10-08 11:44 (ip-77-25-137-234.web.vodafone.de)
markmerk3 pts/0        2010-09-29 18:51 (:0.0)
seamonkey pts/6        2010-09-27 15:50 (:1.0)
markmerk3 pts/5        2010-09-27 14:04 (:0.0)
seamonkey tty8         2010-09-27 15:49 (:1)
markmerk3 pts/13       2010-09-28 17:23 (:0.0)
markmerk3 pts/3        2010-10-05 10:40 (:0.0)
Run Code Online (Sandbox Code Playgroud)

你看,有两个用户在运行 X 会话,markmerk3 在显示 0 和 seamonkey 在显示 1。我认为你需要 grep for tty[0-9]* 然后确保在行尾有 (:[0 -9.]*) 以摆脱控制台登录并从括号之间的字符串中提取显示 ID。

  • 命令 `who` 会告诉你谁登录了以及该登录在哪个 X 显示器上。您可能只需要对其进行一些过滤。 (2认同)

小智 13

这个帖子有点旧,抱歉,但我希望我仍然可以为该主题添加一些有用的内容。(Josef Kufner 也写了一个不错的脚本,它对我的​​口味来说有点太长了,并且它使用了 PHP)。

我还需要一个原始问题中描述的工具(向所有活动的 X 用户发送消息)。根据这里的答案,我编写了这个仅 bash 的小脚本,它搜索活跃的 X 用户(使用who),然后notify-send为每个活跃用户运行。

最棒的是:您可以像“通知发送”一样使用我的脚本及其所有参数!;-)

通知发送所有:

#!/bin/bash
PATH=/usr/bin:/bin

XUSERS=($(who|grep -E "\(:[0-9](\.[0-9])*\)"|awk '{print $1$NF}'|sort -u))
for XUSER in "${XUSERS[@]}"; do
    NAME=(${XUSER/(/ })
    DISPLAY=${NAME[1]/)/}
    DBUS_ADDRESS=unix:path=/run/user/$(id -u ${NAME[0]})/bus
    sudo -u ${NAME[0]} DISPLAY=${DISPLAY} \
                       DBUS_SESSION_BUS_ADDRESS=${DBUS_ADDRESS} \
                       PATH=${PATH} \
                       notify-send "$@"
done
Run Code Online (Sandbox Code Playgroud)

将上述代码复制到名为 的文件中notify-send-all,使其可执行并将其复制到/usr/local/bin/usr/bin(根据需要)。然后在控制台会话中以 root 身份运行它,如下所示:

notify-send-all -t 10000 "Warning" "The hovercraft is full of eels!"
Run Code Online (Sandbox Code Playgroud)

我已经在不同的机器上使用它几个月了,到目前为止没有任何问题,我已经在 MATE 和 Cinnamon 桌面上对其进行了测试。也在 cron 和 anacron 中成功运行它。

我为/在 Arch Linux 下编写了这个脚本,所以如果您在其他 Linux 发行版或桌面上遇到问题,请告诉我。