Screen給我留下如此深的印象,感動(dòng)了我,或許是因?yàn)樵谖沂褂肬nix系統(tǒng)工作的前10年中,從來沒有聽說過它的存在。我浪費(fèi)了大量時(shí)間試圖解決它已經(jīng)解決的各類問題?;蛘?,我也許很容易被感動(dòng)。不過如果screen對(duì)你來說是一個(gè)新東西,或者你已經(jīng)知道她,并想得到它的一些使用技巧,請(qǐng)接著讀下去。
Screen工具是一個(gè)終端多路轉(zhuǎn)接器,在本質(zhì)上,這意味著你能夠使用一個(gè)單一的終端窗口運(yùn)行多終端的應(yīng)用。你現(xiàn)在可能會(huì)想,“有什么了不起,我早就能夠?qū)⒐ぷ鞣旁趕hell的后臺(tái)來執(zhí)行了?!贝_實(shí),你能夠那樣做,不過若是程序本身不能夠放入后臺(tái)怎么辦――也就是說,一些用ncurses寫的程序?或者,如果你需要獲得終端的整個(gè)對(duì)話該怎么辦?再有,根據(jù)程序的先決條件,可能同時(shí)運(yùn)行的程序之間會(huì)有影響。
Screen將允許你做到所有的這些事情。你的程序?qū)⒉粫?huì)察覺到與在單獨(dú)的終端下運(yùn)行有何不同,這將使它們運(yùn)行的很好。這種情況下也沒有客戶機(jī)或服務(wù)器等“遠(yuǎn)程”工具的概念,只要在系統(tǒng)中安裝了screen工具,你就可以運(yùn)行你想要的工具,并且能夠用screen連接系統(tǒng),也就是說,你擁有所有你需要的東西。Screen的另一個(gè)好處是它由GNU組織撰寫和維護(hù),因此,它能夠在可以想像的到的幾乎所有的Unix平臺(tái)上使用。(對(duì)于那些管理多種不同類型系統(tǒng)的人來說,這非常關(guān)鍵,因?yàn)樗馕吨隳軌蛟诓煌钠脚_(tái)上使用相同的工具。)
Screen工作的例子
在我家里,我運(yùn)行了一個(gè)低功率的FM發(fā)射器以廣播我的音樂收藏。(發(fā)射器相比無線連接并不貴,它能夠讓我在院子里使用隨身聽仍然聽到我的頻道。)我使用名片mp3blaster驅(qū)動(dòng)發(fā)射器,這是一個(gè)非常好的基于控制臺(tái)的MP3播放器,能夠支持巨大的MP3收集。一旦它開始運(yùn)行,mp3blaster的信息看起來就像下圖一樣:

迄今為止,它都是如此的優(yōu)秀:我能夠打開一個(gè)窗口,開始mp3balster,整天廣播音樂。但是如果我坐在樓上我的筆記本面前,并且不詳跑到樓下改變播放列表該怎么辦?很簡(jiǎn)單,我只需要在一個(gè)screen對(duì)話下啟動(dòng)mp3blaster,然后能夠從任何擁有shell的系統(tǒng)訪問所調(diào)用的screen。
我能夠使用如下的方法開始一個(gè)叫做“radiostation”的screen對(duì)話:
tmancill@ghostrider:~$ screen -S radiostation
(此時(shí)出現(xiàn)一個(gè)空白的screen)
tmancill@ghostrider:~$ mp3blaster
(載入我的播放列表,然后按下play開始發(fā)射)
(按下“CTRL-a”,然后按下“d”離開)
在這里,我能夠退出我的shell,而mp3blaster則繼續(xù)保持工作,使用現(xiàn)有的音軌信息和運(yùn)行時(shí)間來更新終端窗口(現(xiàn)在此窗口并不存在)。讓我們假設(shè),我的妻子打電話給我說,“嘿!播放一些不同于你收藏的音樂的吧!”,然后,我用ssh登錄ghostrider機(jī)器,并使用下面的命令恢復(fù)會(huì)話:
tmancill@ghostrider:~$ screen -r radiostation
如果我碰巧忘記了正在運(yùn)行的screen會(huì)話的名字,我可以使用“-ls”開關(guān)來查看正在運(yùn)行的會(huì)話:
tmancill@ghostrider:~$ screen –ls
There are screens on:
10238.frm (Detached)
25400.radiostation (Attached)
2 Sockets in /var/run/screen/S-tmancill.
如果我離開辦公室時(shí)沒有注銷“radiostation”screen,我能夠恢復(fù)它,指示screen在恢復(fù)運(yùn)行(-r)我所請(qǐng)求的對(duì)話之前跟任何正在運(yùn)行的對(duì)話分離(-d)。在我辦公室的窗口上,我將看到:
tmancill@ghostrider:~$ screen -r radiostation
[remote detached]
當(dāng)然,你不可能運(yùn)行這個(gè)廣播站而耗盡所有的screen。在生產(chǎn)環(huán)境中,這非常有用,因?yàn)槟悴槐貐^(qū)分你應(yīng)該從哪個(gè)地點(diǎn)訪問這個(gè)對(duì)話。在我的辦公室中,我需要在GDB(GNU Project debugger,http://www.gnu.org/software/gdb/gdb.html)下運(yùn)行一塊自動(dòng)售貨機(jī)軟件,以便在它們存在缺點(diǎn)(segfaulted)時(shí),能夠得到錯(cuò)誤的回溯跟蹤信息。當(dāng)崩潰發(fā)生時(shí),我的監(jiān)控軟件將向我們發(fā)出警告通知,我們二十四小時(shí)隨叫隨到的支持團(tuán)隊(duì)成員將訪問這個(gè)會(huì)話,在我們單獨(dú)的每個(gè)工作站上運(yùn)行GDB shell來解決問題。這里有一個(gè)選擇,就是可以從系統(tǒng)控制臺(tái)直接運(yùn)行軟件,但這意味著待命的技術(shù)團(tuán)隊(duì)必須在現(xiàn)場(chǎng),然后必須物理的進(jìn)入數(shù)據(jù)中心執(zhí)行后續(xù)的工作。因此,screen絕對(duì)是一個(gè)適合的解決方案。
有一件事需要謹(jǐn)慎行事:screen是一個(gè)對(duì)用戶權(quán)限非常敏感的程序,也就是說它會(huì)根據(jù)執(zhí)行操作的用戶來進(jìn)行不同的響應(yīng)。在GDB的例子中,自動(dòng)售貨機(jī)軟件運(yùn)行于一個(gè)特殊的用戶賬戶下,因此如果你使用“su”或“sudo”命令改變成另一個(gè)用戶,你將遇到權(quán)限問題。出現(xiàn)這種問題的原因是screen必須能夠打開你的tty(終端)。舉一個(gè)例子,讓我們假設(shè)我想在我系統(tǒng)中的screen下以用戶“asterisk”運(yùn)行一些程序,如果我以用戶“tony”登錄,然后改變?yōu)橛脩簟癮sterisk”,我將用以下的命令來運(yùn)行:
asterisk@bach:~$ screen -S pbx
Cannot open your terminal '/dev/pts/146' - please check.(不能打開你的終端“/dev/pts/146” - 請(qǐng)檢查。)
asterisk@bach:~$ ls -al /dev/pts/146
crw------- 1 tony tty 136, 146 May 31 18:16 /dev/pts/146
就像你能夠看到的一樣,由于安全問題,我的tty(終端)由打開shell的用戶所擁有,而不是我改變?yōu)閍sterisk后的有效用戶ID。解決這個(gè)問題的一個(gè)方式是在調(diào)用screen之前,直接以用戶asterisk登錄,但這個(gè)問題同樣會(huì)以另外的形式呈現(xiàn),那就是,如果我以asterisk開始工作,然后在其它用戶下請(qǐng)求聯(lián)機(jī),之后再切換回asterisk,“screen –r”仍將不能打開終端。同樣注意到,在我改變?yōu)橛脩鬭sterisk之前,“screen –ls”也不會(huì)向我顯示出“pbx”會(huì)話,這是由于screen為每個(gè)screen用戶創(chuàng)建了一個(gè)文件夾,它只能列出此用戶的會(huì)話。
那么,該怎么做才能規(guī)避這些權(quán)限問題呢?如果用戶賬號(hào)有一個(gè)密碼,你通常能夠通過ssh以此用戶直接進(jìn)入系統(tǒng)(也可能是本地機(jī))?;蛘撸绻憧偸呛艽颐?,并且有足夠的自信,感覺并不會(huì)存在本地安全威脅,你則可以在tty(終端)修改權(quán)限。如果你這樣做了,請(qǐng)確信在工作完后,你已經(jīng)從你工作的終端上注銷。實(shí)際上,你已經(jīng)給予了每個(gè)本地系統(tǒng)用戶通過shell訪問的權(quán)限。另一個(gè)選擇是改變成root用戶再調(diào)用screen,然后在screen會(huì)話中改變?yōu)檫\(yùn)行工作所需的系統(tǒng)賬號(hào)。這樣做能夠正常的原因是超級(jí)用戶能夠打開任何用戶的ty(終端),而表面上,你的支持團(tuán)隊(duì)?wèi)?yīng)該有改變?yōu)閞oot用戶的足夠權(quán)限。
Screen能夠幫助你使用那些不適合“無人看管”使用的大量終端軟件,并且只需運(yùn)行一個(gè)起始會(huì)話即可。相比之前你可能通過多個(gè)會(huì)話登錄遠(yuǎn)程系統(tǒng),它的部署是如此快速,易用性又是如此之好,或者說它在你的Linux控制臺(tái)上添加和設(shè)置了附加的虛擬控制臺(tái)。這就是screen,上面的文章將指導(dǎo)你更好的使用這個(gè)強(qiáng)大的工具,你可以在你需要的任何時(shí)候運(yùn)行它。