墙不会在16.04上广播到GUI终端


11

标题总结了一下。运行wall <<< "TEST"在任何TTY中都会显示该消息,但不会在任何GUI终端(使用gnome-terminal和测试过sakura)中显示该消息。

我有几个依赖于wall消息的电池和温度监视脚本,最近升级到16.04后,我注意到它们已停止在GUI中工作。

我无法确定这是错误还是导致消息无法在GUI中显示。

我应该如何进行?

附加信息:

byobu在gui终端中运行确实允许查看墙消息


2
可能与askubuntu.com/questions/12654/...(直视xmessagegxmessagenotify-send
尼克·温伯格

6
我今天早些时候读过。是的,有些相关,但最大的异议是1)这个问题来自10.10,而wall 一直在14.04中工作 2)解决方案如果我不满意的话。notify-send 仅适用于短消息且仅在GUI中起作用。wall在所有终端上使用一个命令,而不是为tty AND为gui以及可能在其他DISPLAYs 上的所有其他会话编写一些命令,具有很好的便利性,所以这不是一个很好的选择,至少恕我直言
Sergiy Kolodyazhnyy

我最近在15.010中遇到了同样的问题。我在16.04 Ubuntu Mate上,它在这里似乎可以正常工作。底层库中可能存在问题。也许看看mesg命令做什么?shutdown -k 5是否在所有虚拟终端上正常工作?写功能正常吗?如果我发现另一台无法运行的机器,我将查看源代码。我猜这是一个用户空间库问题。
j0h

1
@ j0h实际上,问题归结于gnome-terminal。它曾经用于更新登录记录,所以例如,如果您who以前在gnome终端中运行,我将显示所有打开的选项卡,但不再显示。Wall仅将消息发送到那些更新登录记录的终端会话。配合默认情况下使用其他终端。我很早以前就弄清楚了,但从未实际发布答案。将在本周的某个时候这样做。
Sergiy Kolodyazhnyy 2016年

我有个想法,您如何破解:<br>
Stancu Mihai

Answers:


5

由于gnome-terminal的工作方式,wall请勿将其注册为终端。在这里可以找到更详尽的解释。我认为樱花也是一样。

根据Stancu Mihai的回答,我创建了一个脚本来模仿wall通常的工作方式,包括带有用户名和时间戳的横幅(使用-n或--nobanner删除横幅)。该脚本当前不支持从文件中读取消息。

您可以wall通过在~/.bashrc以下位置添加别名来替换普通命令:

echo 'alias wall="~/your/path/to/wall.sh"' >> ~/.bashrc

用法示例:

$ wall "some message"

Broadcast message from username@hostname (pts/19) (Wed Mar 29 11:07:35 2017):

some message

$ wall -h

Usage:
 wall [options] [message]

Write a message to all users.

Options:
 -n, --nobanner          do not print banner
 -h, --help              display this help and exit

干得好@danmou!
Stancu Mihai

1

是的,的确,gnome-terminal不会更新登录记录,因此我试图找出另一种解决方案:

  1. 让我们找出所有活动的伪终端
ps -ef | grep " pts/" | awk '{print $6}' | sort -u | tee terminals4message.txt

这有助于您列出所有桌面终端会话。

向活动桌面终端会话发送消息的另一种方法

echo "$MESSAGE_to_send" | sudo tee /dev/pts/$terminal_number
  1. 不要忘记tty会议
ps -ef | grep " tty" | awk '{print $6}' | sort -u | grep -v "pts" | tee terminals4message.txt

这可以帮助您列出所有pty会话

  1. 向所有人发送消息
cat terminals4message.txt | while read TTY_TO; do echo -e "SYSTEM MESAGE: $(date) - \n MESAJ" | sudo tee /dev/$TTY_TO 1>/dev/null
  1. 现在,让我们将它们放在一起。 您可以创建一个不错的脚本来替换当前的Wall应用程序并集成以上所有内容。
    之后,您可以添加到〜/ .bashrc中, alias wall="your_wall_replacement.sh" 这样就无需删除当前墙

对不起,如果有什么不对劲,因为有人没有让我专注于这个问题...如果你们发现了奇怪的事情,请发表评论。

10倍


这是一线的。我用cut替换了awk,所以它只有一种类型的报价。ps -ef | grep -e " tty" -e " pts/" | tr -s " " | cut -d " " -f 6 | sort -u | while read TTY; do echo "MESSAGE" | tee /dev/$TTY 1>/dev/null; done
CJxD

0

正如其他人建议的那样,有很多方法,我在这里介绍了一种我发现的更直接(简单)的方法(采用echo "$MESSAGE_to_send" | sudo tee /dev/pts/$terminal_number: 此处讨论的方法 )。

echo "Your message" > /dev/pts/$terminal-no

在这里,terminal-no可以通过“ tty”命令从另一个终端获得。

tty

/dev/pts/12

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.