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

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