您能解释一下输出中的以下几行netstat
吗?
Active UNIX domain sockets (w/o servers)
Proto RefCnt Flags Type State I-Node Path
unix 2 [ ] STREAM CONNECTED 37133819 /tmp/.lxterminal-socket:0-xralf
unix 2 [ ] STREAM CONNECTED 37109191 /tmp/.lxterminal-socket:0-xralf
答案1
客户端-服务器 GUI 程序
与当今的其他几个 GUI 程序一样,自 2008 年以来lxterminal
一直尝试从单个进程显示所有终端仿真器窗口,每个用户每个 X 显示一个。为此,它会尝试通过您所看到的名称(包含显示名称和您的用户名)连接到现有套接字。
- 如果连接成功,它只是将当前目录和参数向量转储到套接字并退出。它不使用文件描述符传递将打开的文件描述符直接传递到其当前目录,而是按名称传递。
- 如果连接失败,它会尝试本身成为该套接字上的侦听服务器。它读取包含当前目录和参数向量的消息,并为每次读取打开一个新的 GUI 终端仿真窗口,就好像它是它自己的当前目录和参数向量一样。
这样做的明显效果是,lxterminal
您调用(并保持运行)的第一个程序同步运行,而第二个和后续程序则不然。要观察这一点,请从不 lxterminal
实例运行,运行不同的终端模拟器,并调用
lxterminal & 睡眠 1 ; LX终端来自贝壳。 shell 将在 1 秒后返回到提示符,并仅显示 1 个
lxterminal
仍在运行的作业。
rxvt 具有类似的功能,但必须显式调用服务器urxvtd
并显式运行urxvtc
客户端。运行 plainurxvt
不会尝试任何客户端-服务器恶作剧。
GNOME 终端仅有的相比之下,这种方式是有效的。它总是将参数向量传递给服务器进程,然后退出。此外,每个用户只有一个服务器进程,处理所有显示(以及该机制初始化、引导方式中的错误)。
不安全感
使用可预测的名称创建文件和套接字/tmp
是一个众所周知的安全问题,并lxterminal
分享它。用户可以在同一台计算机上的其他用户运行的可预测位置预先创建套接字,lxterminal
并尝试与之通信。
相反,rxvt 使用每个用户主目录的不可组写、不可其他写的子目录。解决此问题的另一种可能性是,lxterminal
同样不允许其他用户访问用他们的套接字替换自己的套接字,方法是将套接字放在./run/user/username/lxterminal
(GNOME 终端使用用户级桌面总线在客户端与其服务器之间进行通信。如今,其AF_LOCAL
套接字所在的位置无法被其他非特权用户取代。)/run/user/username/
虫子
困扰 GNOME Terminal 的问题之一是,它在单个服务器进程中为终端模拟的每个实例占用大量打开的文件描述符。以前是16;现在已降至“仅仅”8。
lxterminal
使用2,其中之一是来自客户端进程的套接字连接的泄漏打开文件描述符。打开和关闭足够多的终端仿真,最终lxterminal
将耗尽可用的文件描述符。以下内容从没有lxterminal
运行任何实例开始,在我的一台机器上仅用了一分钟多的时间就用完了服务器的所有可用文件描述符:
(ulimit -H -n 1024 ;lxterminal)& 序列 0 1024 |当读 -ri 时;执行 lxterminal -e /usr/bin/true ;完毕
进一步阅读
- 无法从 PID 中杀死 gedit 进程
- 运行真正的 gnome-terminal 多进程实例
- 弗雷德·钱 (2008-06-16)。 添加缺少的文件以进行进程共享。 1f69f854d8ab1377888e18c759f11eae99da75b9。 lxde/lxterminal。 GitHub。
- 弗雷德·钱 (2008-06-16)。 添加进程共享支持。 074ec09b779c0265a316d37742d2957146bcb141。 lxde/lxterminal。 GitHub。