Networking

netstat 輸出中的 lxterminal

  • July 23, 2018

你能解釋一下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

客戶端-伺服器 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 終端的問題之一是它在單個伺服器程序中為終端仿真的每個實例佔用了大量打開的文件描述符。以前是 16;現在下降到“僅僅”8。

lxterminal使用 2,其中之一是來自客戶端程序的套接字連接的洩漏打開文件描述符。打開和關閉足夠多的終端仿真,最終lxterminal將耗盡可用的文件描述符。以下,從沒有lxterminal執行實例開始,在我的一台機器上在一分鐘內用完所有伺服器的可用文件描述符:

(ulimit -H -n 1024 ; lxterminal) &
序列 0 1024 | 同時讀取 -ri ; 做 lxterminal -e /usr/bin/true ; 完畢

進一步閱讀

引用自:https://unix.stackexchange.com/questions/333539