如果我打开终端并执行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 的新会话?
答案1
w
utmp
显示存储在(/var/run/utmp
通常在 Linux 系统上)的信息。这通常仅由“登录”会话更新,IE login
(用于虚拟控制台或串行连接上的登录)、显示管理器(用于图形会话)、SSH 服务器(用于 SSH 连接)和一些(大多数?)终端仿真器。在后一种情况下,它们是否更新utmp
取决于它们内置的支持和配置;例如xterm
有ut
这个标志(-ut
禁用utmp
更新,+ut
启用更新),以及 GNOME 终端不再utmp
直接更新。
utmp
因此,您会看到在您的案例中添加的条目:一个是由您的显示管理器添加的(在tty7
),另一个是由您正在使用的某些终端模拟器添加的。
应该可以utmp
使用例如包装命令来将日志记录添加到您喜欢的任何内容中libutempter
,但这显然是并不像人们希望的那么简单。
答案2
w
不显示终端会话。这登录该程序报告的数据库w
不是一个终端数据库。 (从形式上来说,它是一个用户计费数据库,但是单一 Unix 规范在这一点上是不完整的。)
如果它是一个终端数据库,它会记录所有的伪程序使用的终端,例如 NeoVIM、emacs、tmux
、screen
、ptybandage
、ptyrun
、 甚至script
.但事实并非如此,也并非如此。
(人们可以提出类似的论点,这需要对历史有更多的了解,关于它不记录“呼叫”终端使用情况以及 BBS、FidoNet 和 UUCP 终端会话之类的内容。)
作为一个登录数据库,它记录登录会话,文本和图形。 libvte 的人认为写入这个数据库是在权限范围内的登录子系统,图形和文本,不在终端的权限之内模拟器运行的之内登录会话。这是一个公平的观点,因为它允许可信计算基础之外的程序写入/更新登录数据库,这对登录记帐的安全性来说是无稽之谈。
因此,您不应期望每个终端模拟器会话都在登录数据库中显示为登录会话 - 或者实际上任何终端模拟器会话。甚至调用登录 shell 的终端模拟器没有对系统进行任何实际登录,并且完全在已登录的会话中进行操作。终端仿真器作者试图让登录数据库记录终端仿真器会话,但这种努力导致了许多早已认识到的问题。
相反,你应该期望看到您的单个记录图形用户界面登录会话。 (尽管,正如进一步阅读中的一篇文章所解释的,实际上这相当混乱。)
进一步阅读
- 乔纳森·德博因·波拉德 (2018)。Unix 登录数据库。经常给出的答案。
- https://unix.stackexchange.com/a/437762/5132
pututxline
。 基本规格。 IEEE 1003.1:2017。开放组。