歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux綜合 >> Linux資訊 >> 更多Linux

Xdm會話進程

By Chris Carlson 翻譯: 程劍峰     在安裝好系統中的X窗口系統後,只要把系統默認的啟動模式設置成模式5,系統在啟動時就會自動運行xdm。現在我們應該考慮該如何設置xdm,使它在我們登錄進入系統時能自動啟動一些應用程序。     在單位裡,我每天回家前總是要退出系統,因為當我不在時,其他人也可能會來使用機器。我可不希望其他人在我的辦公室裡用我的帳號登陸到機器上,雖然這樣的事並不常有。(也許會有人出於好奇想翻翻我存在硬盤上的郵件。)現在的問題是,我希望在我登錄進入系統時,Xdm可以自動啟動一些應用程序,比如我的記事簿和我的日歷程序等。     在這篇文章中我打算討論一些關於X窗口中的會話進程的東西:它是怎麼啟動的,如何對它進行定制。我要告訴你怎樣讓系統在啟動時自動啟動你喜歡的Window管理器(Window Manager),怎樣讓Xdm自動啟動應用程序,怎樣用你喜歡的字體和顏色設置X環境。由於所有UNIX平台上的X Window系統都差不多,所以以下的內容不僅適用於Linux上的XFree86系統,也適用於其他平台上的X Window系統。事實上,我會對Redhat 5.x中的XFree86和SGI IRIX中的X Window系統進行比較。你會發現在這兩個系統中我們用到的文件都使用相同的文件名,只是在不同的目錄下。     我知道其他人已經寫了一些有關X Window配置的文章,比如在十二月的那期(譯者注:英文原版linux公報的期號)有一篇Jay Ts寫的“X Window管理”。雖然X Windows是非常通用的,可它也是非常復雜的。我認為有關X Window的東西足夠寫很多文章。這些文章的內容可能有一部份是重復的,但每篇文章都可以從不同的角度來寫。我的這篇文章盡可能從一個用戶而不是一個管理員的角度來寫。     這篇文章的內容是基於以下幾個前提條件的:     系統中的xdm使用Red Hat的默認設置。也就是說你沒有改過/etc/X11/xdm目錄下的任何文件。(由於我沒有安裝過其他的Linux,我假設它們的默認設置也和Red Hat的一樣,或者他們間雖有差別,但不影響我們這裡討論的內容。)考慮到這些情況,對於那些xdm用到的文件,我就直接使用系統默認的文件名。應當注意的是,大多數的文件名我們都可以自己加以修改的,比如你可以改動/etc/X11/xdm/xdm-config文件,或者在啟動xdm時通過命令行指定其他的配置文件。(在SGI上,設置文件為/var/X11/xdm/xdm-config,我見過其他的一些系統使用/usr/lib/X11/xdm/xdm-config。)   你對X Window使用的客戶/服務器的概念應該有一個基本的了解。即X服務器是一個程序,處理顯示和鍵盤輸入。其他應用程序作為客戶使用X服務器提供的服務進行顯示和讀取輸入。   你對X資源及其在X環境中的用途有一定的了解。   用戶會話的初始化和終止     X服務器通過xdm啟動後出現用戶登錄屏幕。用戶從這個屏幕成功登錄以後,xdm實際上就成功的啟動了一個“用戶會話”。這個會話是一個shell腳本(shell script)。這個腳本終止時就會終止用戶會話,同時xdm會結束X服務器,並使系統回到用戶登錄狀態。   在開始一個X會話之前,xdm會用超級用戶(root)的權限運行一個啟動腳本以執行一些必需的初始化。隨後,為了保證以當前用戶的環境設置運行X Window,腳本文件/etc/X11/xdm/GiveConsole將把/dev/console的擁有者從root改回到當前用戶。     同樣的,當會話結束時xdm會首先以超級用戶的權限執行一個小腳本來清除由啟動腳本創建的東西。然後由腳本/etc/X11/xdm/TakeConsole將/dev/console的擁有權改回超級用戶。     請注意在SGI上這兩個文件分別是/var/X11/xdm/GiveConsole和/var/X11/xdm/TakeConsole     在這篇文章中我們感興趣的是這個用戶會話本身的啟動過程。在這個過程中,xdm啟動一個子進程運行腳本/etc/X11/xdm/Xsession(在SGI上是/var/X11/xdm/Xsession)並等待其退出。當這個子進程退出時,xdm就會運行退出腳本並回到登錄屏幕。這個會話腳本是運行在當前用戶權限下的。     在xdm,當用戶輸完密碼後,按F1鍵而不是Enter鍵時,xdm會將參數“failsafe”傳遞給用戶會話。這在由於用戶對其會話腳本文件進行了錯誤的修改而不能正常登錄進入系統時顯得非常有用。在下文中我會詳細討論如何利用這一特性。應當注意到,在Linux和SGI中這一用法都是一樣的。     Xsession文件     Red Hat中提供的/etc/X11/xdm/Xsession文件相當簡單,特別是和SGI中的/var/X11/xdm/Xsession相比時更是如此。這個文件是標准的shell腳本,用於處理所有用戶的X啟動和初始化。系統管理員可以將各用戶初始化文件中一致的部分放在此文件中。   在前面已經提到,用戶登錄時如果按F1鍵而不是Enter鍵,系統會傳遞參數“failsafe”給會話進程。/etc/X11/xdm/Xsession文件在運行時,首先檢查該參數是否存在。如果有此參數,就調用exec來執行xterm。這樣就會跳過所有的用戶初始化而直接進入一個終端窗口。應當注意到當用戶錯誤地改動了自己的個人會話環境文件而導致不能正常登錄時,這是一個很好的登錄方法。     對於那些不了解exec的功能的讀者,這裡對exec進行一點解釋:exec是所有標准的shell程序都提供的內部命令。它使用調用的程序代替當前正在運行的shell。所以exec永遠不會返回到當前正在運行的shell中(除非被調用的程序由於某些原因而無法啟動),同時父進程也不知道子進程中發生的任何變化。被exec調用的程序擁有shell的進程ID,當該程序結束時shell也就結束了,並結束用戶會話。     如果Xsession沒有收到“failsafe”參數,腳本將stderr重定向到一個錯誤日志文件並繼續執行。這個文件就是用戶home目錄下的.xession-errors文件。如果系統不能在用戶的home目錄下建立該文件或者該文件由於某種原因而導致系統無法對它進行寫入操作,腳本就會試著使用/tmp/xses-$USER文件。$USER是用戶的登錄名。     這個錯誤文件對於判斷用戶會話中的問題非常有用。所有應用程序(包括窗口管理器和窗口管理器啟動的應用程序)產生的錯誤信息都會寫入該文件中。如果用戶在登錄進入系統後不能啟動一個用戶會話,他就可以使用“failsafe”的辦法(參見上文)登錄,然後檢查這個文件中的出錯信息。這些出錯信息對於我們尋找問題所在是很有幫助。     啟動用戶會話成功後,標准的Xsession文件會將控制權傳給一組shell腳本中的某一個。具體使用哪個文件要根據用戶具體情況決定。由於它是使用exec來調用這些文件的,因此一旦被調用程序開始運行,它就成為一個新的用戶會話並替代掉Xsession進程。這些shell腳本包括:     $HOME/.xsession   $HOME/.Xclients   /etc/X11/xinit/Xclients   SGI在對腳本的處理上和Linux稍有不同。SGI不要求腳本是可執行的。如果這些腳本是不可執行的,系統會調用/bin/sh來運行這些程序。同時SGI只檢查$HOME/.xsession。如果沒有這個文件,系統的Xsession文件就會建立一個SGI內置的默認用戶環境。RedHat則把用戶會話環境分成兩個部分,它在系統按照標准方式安裝時,就提供了一個/etc/X11/xinit/Xclients文件。   如果以上的三個文件都不存在或者不可執行,系統會嘗試讀取用戶的.Xresources文件(如果有該文件的話),並調用exec執行xsm。xsm是RedHat Linux提供的多個窗口管理器之一。     用戶定制的Xsession文件     從上面對系統Xsession文件的解釋中你可能已經猜到用戶可以創建自己的shell腳本。這是一個非常強大的功能,允許每個用戶決定每次從X登錄進入系統後系統可以先自動進行哪些操作。在這個腳本中,用戶可以啟動多個應用程序、設置X Window主窗口(root window)的資源環境、設置系統環境變量、修改默認的鍵盤定義以及選擇一個窗口管理器等。   設置你個人的Xsession文件的最簡單的方法是把系統的/etc/X11/xinit/Xclients文件拷貝到你的home目錄下,命名為.xsession或.Xclients(在下文中用用戶的Xsession文件表示)並根據需要進行修改。在這裡,我不打算解釋/etc/X11/xinit/Xclients文件中的所有內容含義。我只想解釋那些可能用到的東西。     一個很重要的事就是裝載X Window主窗口需要的資源。這通常由以下的命令實現:     resources=$HOME/.Xresources   if [ -f "$resources" ]; then   /usr/bin/X11/xrdb -load "$resources"   fi   另外一件用戶常做的事是修改用戶主窗口的背景圖案。這可以用/usr/bin/X11/xsetroot命令實現。我是這麼設置背景圖案的:   /usr/bin/X11/xsetroot -solid DarkSeaGreen4   這個命令也可以用於設置主窗口的默認光標和光標的顏色。背景圖案既可以用一個雙色的格子圖案也可以使用一個X位圖。   同樣的,/usr/bin/X11/xset命令可以用來設置喇叭的音量、擊鍵、DPMS(節能)特性和鼠標的參數。這個命令還能設置自動重復和屏幕保護的參數。     如果你想定義特殊鍵,你可以在腳本中運行/usr/bin/X11/xmodmap。比如我想要使用完全的ISO 8859-1字符集,並在我的文件中插入國際字符,由於linux已經F1和F2分別定義為F11和F12,而我的鍵盤上有F11和F12鍵,所以我希望把這些鍵分別定義為F13和F14。為了達到這個目的,我在$HOME/.xmodmaprc中加入了以下內容:     keycode 113 = Multi_key   keysym F1 = F1 F13   keysym F2 = F2 F14   keysym F3 = F3 F15   ...   keysym F10 = F10 F22   keycode 95 = F11 F23   keycode 96 = F12 F24   然後我在$HOME/.xsession文件中加入以下內容:   if [ -r $HOME/.xmodmaprc ]; then   /usr/bin/X11/xmodmap $HOME/.xmodmaprc   fi   最後,最重要的一步是選擇自己喜歡的窗口管理器。RedHat默認的是運行fvwm,因為它可以設置成看起來和Windows 95差不多。由於我經常使用SGI計算機,我更喜歡Motif(不是免費的,通常不隨Linux提供)。可供選擇的還有xsm和twm。你可以讀讀它們的使用說明然後再決定使用哪個。   用戶可以在Xsession文件的末尾用exec命令來調用窗口管理器。這樣用戶只有退出窗口管理器才能終止他們的X會話以重新回到登錄屏幕。相對而言,我更喜歡將窗口管理器當作後台進程運行,並在Xsession文件的末尾使用exec來調用xterm。這樣當我退出xterm會話時用戶會話就會終止並回到登錄屏幕。要注意,在這種情況下,由於X Window將被關閉,所以此時窗口管理器和所有窗口程序都會終止,但是所有那些作為後台進程運行的非窗口程序是不會自動終止的,在X用戶會話結束後他們還會繼續運行。     這是我啟動Motif窗口管理器的方法:     /usr/bin/X11/mwm   這是最後的xterm:   exec nxterm -geometry 80x50+10+10 -ls   這樣可以使運行的xterm支持彩色。它每行可顯示80個字符,共顯示50行。窗口會定位在屏幕的左上角(在10x10象素的位置)。最後的那個選項是讓nxterm把shell當作登錄shell來運行。   在用戶的Xsession文件裡,你可以運行許多的xterm, xclock或其他程序。所有的這些程序都會在你登錄時自動啟動。如果你希望這些程序固定在屏幕上的某些位置,別忘了定義程序窗口的坐標(使用-geometry選項)。     還有,記著讓這些程序在後台執行(以“&”結尾)。否則用戶的Xsession文件會等到這些程序終止後才繼續執行下一行命令。     重要的竅門     在這裡我想討論用戶Xsession文件中的一些有趣並且重要的竅門。   所有的窗口管理器都可以通過下拉選單中調用應用程序。有些應用程序需要在運行之前設置一些環境變量(比如Netscape需要定義SOCKS_NS)。由於一般來說用戶的環境變量是在shell啟動後才設置的,所以窗口管理器和窗口管理器中啟動的程序將無法設置這些用戶環境變量。在$HOME/.cshrc,$HOME/.profile或$HOME/.login中設置這些變量也是不可能的。     一個竅門就是在用戶的Xsession文件中設置這些變量。在你啟動窗口管理器前設置這些變量是必要的。     我喜歡用的另一個竅門就是在我的用戶Xsession文件中定義XUSERFILESEARCHPATH變量。大多數應用程序在啟動時需要一個程序資源文件,這些文件多半在/usr/lib/X11/app-defaults下。比如Netscape就使用/usr/lib/X11/app-defaults/Netscape來存放程序的資源設置。如果你想在自己的個人環境中修改設置,你可以將此文件拷貝到你的home目錄下加以修改。下次你運行Netscape時它就會根據你Home目錄下的那個文件進行設置。     我發現我的home目錄下擠滿了各種應用程序的資源文件。我想把這些文件放到我自己的app-default目錄下。於是我就建立了這個目錄並把所有的資源文件到拷貝進去。然後我在我的用戶Xsession文件中設置XUSERFILESEARCHPATH變量:     /home/carlson/app-defaults/%N:/usr/lib/X11/%L/app-defaults/%N:/usr/lib/X11/app-defaults/%N   這就可以讓應用程序先到/home/carlson/app-defaults裡尋找程序資源文件,然後才是默認的/usr/lib/X11。   最後一個竅門是給那些有好幾台運行X服務器的計算機的人。在家裡,我有一台SGI O2和我的Linux機器。當我遠程登錄進入O2時,我希望能夠運行X應用程序並把輸出顯示在我的Linux上。為此我需要在每次登錄進入Linux系統後運行xhost以允許遠程登錄使用X服務器。     在我的用戶Xsession文件中有這一行:     /usr/bin/X11/xhost +moonlight   這使得我的Linux系統中的X服務器允許來自moonlight(我的那台O2)的訪問。   結論     我希望你覺得本文對你有一定幫助。我盡力向你展示如何建立你自己的用戶Xsession文件來運行程序,設置環境以及運行你自己的窗口管理器。我相信你自己也可以想出更多的好點子。   我根據SGI上的一個程序寫了個很有用的程序userenv。這個程序創建一個登錄shell做為子進程,並讓其輸出它的環境。這些環境變量以特定格式輸出到stdout上以便於使用shell創建一個相同的環境。     在我的用戶Xsession文件中有這麼一行:     eval `userenv`   這行命令會檢查我計算機當前的用戶環境並以一種shell可以識別的格式輸出它。用戶使用這些輸出數據就可以讓shell在其他機器上創建一個相同的用戶環境。eval命令是將輸出結果送給shell處理。   你可以從我的網站下載eval程序,它在http://members.home.net/cwcarlson/files/utilities.tar.gz     注     我用的是RedHat 5.1,但它好象最近幾年並沒有什麼大的變化。同時我也發現在IRIX等其他的Unix平台上設置這些東西和Linux下差不多一樣。唯一的區別是文件放在不同的目錄下而已。      




Copyright © Linux教程網 All Rights Reserved