如果我打开终端并执行w
命令,那么它将显示:
user tty7 :0 12:04 39:56 36.87s 0.06s /sbin/upstart -
现在,如果打开terminator
或xterm
执行w
命令,那么它将在w
命令的输出中显示它的条目,例如
user tty7 :0 12:04 39:56 36.87s 0.06s
/sbin/upstart -
user pts/2 :0.0 12:50 1.00s 0.02s 0.00s w
gnome-terminal
但是当我打开或时它不会显示新条目xfce4-terminal
。为什么它为终结者而不是 xfce4-terminal 显示新会话?
w
显示存储在utmp
(/var/run/utmp
通常在 Linux 系统上)中的信息。这通常仅由“登录”会话更新,即login
(用于虚拟控制台或串行连接上的登录)、显示管理器(用于图形会话)、SSH 服务器(用于 SSH 连接)和一些(大多数?)终端仿真器。在后一种情况下,它们是否更新utmp
取决于它们的内置支持和配置;例如xterm
有这个ut
标志(-ut
禁用utmp
更新,+ut
启用它们),并且 GNOME 终端不再utmp
直接更新。因此,您会看到已添加到
utmp
您的案例中的条目:一个由您的显示管理器添加(在 上tty7
),另一个由您正在使用的某些终端仿真器添加。应该可以包装命令以将
utmp
日志记录添加到您喜欢的任何内容中,例如使用libutempter
,但这显然不像人们希望的那样简单。w
不显示终端会话。程序报告的登录数据库w
不是终端数据库。(形式上,它是一个用户记帐数据库,但单一 Unix 规范在这一点上是不完整的。)如果它是一个终端数据库,它将记录程序使用的所有伪终端,例如 NeoVIM、emacs
tmux
、、、、、,甚至. 但它没有,也不是。screen
ptybandage
ptyrun
script
(人们可以提出类似的论点,这需要稍微了解历史,关于它不记录“呼叫”终端使用情况以及 BBS、FidoNet 和 UUCP 终端会话之类的。)
作为登录数据库,它记录登录会话,包括文本和图形。libvte 的人认为,写入该数据库是在登录子系统(图形和文本)的范围内,而不是在登录会话中运行的终端仿真器的范围内。这是一个公平的观点,因为它使登录帐户的安全性变得毫无意义,以允许可信计算库之外的程序写入/更新登录数据库。
因此,您不应该期望每个终端仿真器会话都在登录数据库中显示为登录会话 - 或者实际上是任何终端仿真器会话。即使是调用登录 shell 的终端仿真器也没有对系统进行任何实际登录,而是完全在已经登录的会话中运行。终端仿真器编写者试图让登录数据库记录终端仿真器会话,但这种努力导致了许多问题,这些问题早已得到认可。
相反,您应该会看到GUI登录会话的单个记录。(尽管,正如在进一步阅读的文章中所解释的那样,实际上这相当混乱。)
进一步阅读
pututxline
. 基本规格。IEEE 1003.1:2017。公开组。