我很好奇广播消息的行为
$ sudo wall myfile
来自的消息myfile
出现在所有设备上(我可以通过按+ +/dev/ttyN
切换到的设备),它也出现在我打开的窗口上,但它不会出现在(实际上我使用 Linux Mint 和 MATE,所以它是,但它是) 的叉子。CtrlAltfNxterm
gnome-terminal
mate-terminal
gnome-terminal
tmux
如果我在以下位置运行,还有一个有趣的注意事项xterm
:我预计该消息会出现在正在运行的所有终端会话上tmux
(在所有窗口上以及每个窗口的每个窗格中),但实际上该消息仅出现在当前光标位置窗户xterm
。
如果我通过调用检查当前控制终端tty
,它会报告 tmux 中不同窗口的不同终端:比如说,我/dev/pts/11
在一个 tmux 窗口和/dev/pts/12
另一个窗口中都有。但是,广播消息对于每个xterm
窗口仅出现一次,而不是对于在 中打开的每个终端会话出现一次tmux
。
在我看来,终端模拟器在分配伪终端时,需要在某个地方“注册”它以使其能够接收广播消息,因此,xterm
它会这样做,但mate-terminal
也tmux
不会。但这听起来很奇怪,因为伪终端是由内核分配的,因此,它应该在需要的任何地方自动“注册”。
如果有人解释它是如何工作的以及为什么这种行为是这样的(看起来很奇怪),我会很高兴。
答案1
列出的终端暗示该行为在 Linux 中出现:线索位于 的手册页中wall
(索拉里斯例如不同):
wall
在当前所有终端的终端上显示一条消息、一个文件的内容或其他标准输入登录用户。某些会话,例如
wdm
,在开始时有乌姆普(5)ut_type
data 中的 ':' 字符将无法从 中获取消息wall
。这样做是为了避免写入错误。
即wall
使用utmp数据,查找正在使用的终端(即登录的用户),并写入关联的设备。输出中的每一行都w
显示一个(可能的)终端,由终端记录在 utmp 文件中。例如,我通过 ssh 连接到服务器并运行屏幕,同时登录到控制台。为了完整起见,我使用-ls
(login-shell) 选项运行 xterm。这是输出w
:
$ w
19:53:15 up 4:08, 5 users, load average: 0.00, 0.01, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
tom tty2 19:48 5:11 0.04s 0.02s -tcsh
tom pts/0 michener:S.0 15:51 13:18 0.35s 0.24s ssh -X thomas@b
tom pts/2 michener:S.1 16:34 2.00s 0.14s 0.00s sh -c w
tom pts/4 michener:S.3 15:52 3:59m 0.12s 0.00s /bin/sh /users/
tom pts/3 localhost:10.0 19:53 7.00s 0.03s 0.03s -tcsh
并对wall
每个TTY
设备进行写入操作。
但是,如果终端不是写入 utmp 文件,它不会被列出 - 并且wall
会忽略它。
现在,某些程序可能已编译该功能,但缺乏更改它的权限。这就是为什么某些程序setgid
在“utmp”组中运行的原因。其他程序(例如 xterm — 或 gnome-terminal)可能会使用代表其更新 utmp 的外部程序。
对于 gnome-terminal,该功能已被弃用,因为 gnome 开发人员的心态是:(a) 用户在本地计算机上运行,其中gdm
处理登录,并且 (b) 因此登录 shell 和非登录 shell 之间没有什么值得担心的区别。这产生了一些有趣的错误报告:
答案2
在 上urxvt
,您必须发出
chown root.utmp /usr/bin/urxvt
chmod g+s /usr/bin/urxvt
然后它开始工作。
我不明白为什么,只是复制(并测试)自http://permalink.gmane.org/gmane.comp.terminal-emulators.rxvt-unicode.general/1484。