linux的內核級的控制檯/非X終端模擬器包含非常涼爽特徵(如果編譯):每個/dev/ttyN
設備與/dev/vcsaN
和/dev/vcsN
裝置其表示TTY的存儲器內(顯示)狀態對應,分別具有和不具有屬性(顏色,閃爍等)。這可以讓您非常容易cat /dev/vcs7
,並在發現cat
的任何地方查看/dev/tty7
的轉儲。
那天我使用了這種令人難以置信的實用功能,通過SSH登錄系統,並遠程觀看我忘記放入screen
(或類似的)會話中的dd
進程 - 它運行在文本控制檯上,因此我拿了一個微調了我想抓住的角色範圍,目前我正在通過SSH觀看dd
的轉移狀態(順便說一句,每秒一次)。如何以編程方式在Linux控制檯中「轉儲」X終端的內容la/dev/vcs {,a}?
要重申和澄清,/dev/vcs{,a}*
是檢索當前內存中表示的字符設備,內核控制檯VT100模擬器表示爲單個「文本行」(每行「結束時沒有」換行符「 「的屏幕)。
只是爲了消除混淆,我想指出,我不能tail -f
這個設備:它不是像TTY本身的字符流。 (但我從來沒有需要這種行爲,因爲它的價值。)
我一直堅持我的耳朵Perk多年來一種方法來轉儲字符單元內存狀態的X終端模擬器 - 或者確實任何需要與ttys一起工作的任意進程,與我在Linux控制檯上可以採用的方式類似。而且......對於這個問題沒有切實可行的解決方案,我感到很驚訝 - 因爲它可以說存在了大約30年--X是在1984年引入的 - 或者說,是迂腐的,在至少 19年 - /dev/vcs{,a}*
在內核1.1.94中引入;在該版本中最新的文件的日期是2月22日1995年(最早是從1993年12月1日:P)
我想說,我也明白和意識到TTY本身並不是「屏幕緩衝區「,而是一個字符流,而我上面實際使用的非標準功能是Linux VT102仿真器特有的一種獨特功能。但是,此功能是不夠冷靜(這否則爲什麼在主線樹:d),在我看來,有應該是對方給它的東西,與/dev/pts*
工作。
今天下午,我需要屏幕截取交互式ncurses應用程序的輸出,以便我可以從終端中顯示的信息中提取元數據。 (沒有其他實用的方法來實現我所瞄準的目標。)Linux的內核VT100驅動程序將允許這樣的任務很容易地完成非常,我犯了一個錯誤,認爲它,根據這個,它不可能真的難以在X11下做同樣的事情。
到上午9時,我已經決定,最簡單的方法實驗請求遠程屏幕的轉儲將在dtach
運行它(認爲「screen -x
」沒有任何其他選項),並破解dtach
代碼請求屏幕更新並退出。
大約上午11點到12點,我要求屏幕更新並將它們轉儲到stdout
。
大約下午3:30,我接受了使用dtach
是不可能的:
- 首先,它依賴於應用本身發送屏幕重繪上的要求,通過設計,保持代碼的簡單。這很棒,但是,幸運的是,我使用的應用程序不支持全屏重繪 - 它只會重畫屏幕大小的變化(並且只有在屏幕大小完全不同的情況下!)。
- 運行
screen
會話內的程序(因爲screen
是一個真正的終端仿真器和具有內部2D字符單元緩衝液),然後運行screen -x
內部dtach
,也神祕未能產生字符單元的更新。
我以前檢查過screen
,發現代碼足夠瘋了,以消除我可能必須破解的任何傾向;我只能說,瘋狂可能是screen
還沒有我在這裏介紹的能力(這可能會很容易實現)的原因之一。
其他類似這個問題的問題經常得到使用打字稿的答案,或script
;我只是想澄清script
保存tty本身的流到一個文件,我需要通過一個VT100模擬器來獲取屏幕圖像的當前狀態的問題。換句話說,script
對我的問題是一個非常瘋狂的解決方案。