2012年6月28日 星期四

Gnome/KDE/Xorg 底下的個人啟始命令稿: 到底是 .xinitrc .xsession 還是 .xprofile?

Linux 底下有很多 「啟始命令稿」 (initialization scripts)。 比方說, 在文字模式底下, 用戶登入時, 系統會自動執行一次 .profile 這個命令稿。 至於 .bashrc 則是每次進入一個 bash (例如開一個終端機新分頁, 或是從 vim 或其他軟體裡面進入更深一層的 bash) 就會被執行一次。 像我都用文字模式的行事曆 remind, 所以就在 .bashrc 裡面放 remind 指令查詢待辦事項。

那麼在圖形介面底下, 如果想要一登入就執行某一些指令, 應該要把這些指令放在哪一個檔案裡面呢? 我們古代人最早用的是 .xinitrc ; 但近幾年來出現了 .xsession 跟 .xprofile。 不同版本的 linux 有不同的做法, 很傷腦筋。 最近從 SimplyMepis 移民到 Fedora 17 (另一帖詳談) 又遇到這個問題, 所以決定認真搜尋一下答案。

[2016/8/29] 不必這麼辛苦地分析了。 用 ps fx 找比較快!

先解釋一下動機。 雖然 gnome 跟 kde 都可以透過圖形介面設定 「自動啟動」 的程式, 不過這帖要討論的是比較底層、 適用於 gnome/kde/lxde/... 任何桌面環境都能適用的方案。 像貴哥這麼欠缺 品牌忠誠度、 沒事就要換一個版本玩玩看的人, 很需要這樣的方案 -- 最好可以把自己常用的所有登入設定都放在 (適用於任何桌面系統的) 同一個文字設定檔裡面, 而且, 遇到問題上網搜尋解答的時候, 也可能會被指示要改文字版的啟始命令稿; 但是完全照做可能會無效 -- 因為解答者的環境跟你的環境可能不一樣。 所以有必要把這個問題搞清楚。

首先, 根據很多人的建議, .xinitrc 跟 .xsession 的內容應該要設成一樣 [ gentoo 社群 fluxbox 文件 uiuc 文件]。 最簡單的方法, 就是建立其中一個 (比方說 vim .xinitrc), 並且將另一個設成 symbolic link (比方說 ln -s .xinitrc .xsession) 看來, 不同版本的 linux, (最多) 只會選擇這兩者當中的一個來執行。

至於 .xprofile, 根據 Arch Linux 的說法, 是一個 「會被 GDM 跟 KDM 呼叫」 的啟始命令稿。 不過在某些組合底下 fedora debian/kubuntu slackware 都有網友發現 .xprofile 被忽略。

總之, linux 的視窗系統到底會呼叫這三個 「啟始命令稿」 當中的哪一個, 跟不同版本的 linux、 不同的 桌面環境 (desktop environment) 或視窗管理員 (window manager) 都有關係。 下次當你升級 OS 或更改桌面環境/視窗管理員, 卻發現有些啟始設定失效的時候, 請回想本帖。

兩類不同的 X 啟動命令稿 .xprofile 相較於 .xinitrc/.xsession 有什麼差別呢? .xprofile 是被 GDM/KDM 呼叫起來的, 所以它比較單純, 裡面就只放你要加的命令就好; .xprofile 執行結束之後, 控制權會回到 GDM/KDM, 而它也會負責啟動 視窗管理員 (window manager)。 相較之下, .xinitrc/.xsession 就比較麻煩一點了。 不論是誰 (GDM/KDM/startx) 把它叫起來的, 控制權就不會再回去了, 所以你自己的 .xinitrc 或 .xsession 裡面的最後一句通常是 exec gnome-sessionexec startkdeexec enlightenmentexec icewm 之類的, 總之就是自己要變身成某個視窗管理員程式 (或內含視窗管理員的某個桌面環境)。 可能還有很多其他額外的工作要做。 詳見 ubuntu 的文件

了解規則之後, 現在來做一下實驗吧: 把這三個啟始命令稿的舊版 (如果有的話) 先備份起來, 然後建立一個測試用的 .xprofile 裡面只放一句:

    (echo -n "$0 is called at " ; date) >> ~/startup.log

這句話是要叫這個命令稿印出它自己的名字 (也就是 $0) 跟被執行的時間, 並將它記錄到一個檔案裡面。 提醒: 所有的啟始命令稿都必須是 (用戶自己) 可執行的, 所以要記得下: chmod u+x .profile。 然後登出再登入, 並且檢查 ~/startup.log 的內容。 接下來把 .xprofile 改名為 .xinitrc, 並且在最後面加上一句 「變身成桌面環境/視窗管理員」, 再試一次: 登出、 登入、 檢查 startup.log。 最後再把 .xinitrc 改名為 .xsession, 登出、 登入、 檢查 startup.log。 警告! 如果你的 .xinitrc 或 .xsession 忘記加上 「變身」 那一句的話, 等一下你要再登入時, 有可能會發生這樣的狀況: 打完密碼螢幕閃一下, 沒有任何錯誤訊息, 又退回登入畫面。 這時你需要 ctrl-alt-f6 切換到文字模式登入, 並 chmod u-x .xinitrcchmod u-x .xsession 才能再重新登入。 你也會發現: 在 /var/log 底下 find . -mmin -1 尋找最近一分鐘內修改過的檔案, 遍尋不著錯誤訊息。 因為本來就沒錯, .xinitrc 或 .xsession 執行完之後, 沒有啟動桌面環境/視窗管理員, 系統沒事做, 就把你登出了。

你的環境是什麼樣的組合呢? 請用上面的方式做實驗, 並且在底下留言分享你的實驗結果。 請載明: 作業系統版本 (例如 Fedora 17)、 桌面環境/視窗管理員 (例如 KDE 4.8.3)、 哪個程式被啟動 (例如 .xsession)

5 則留言:

  1. 先來貼一下自己實驗的結果:

    Fedora 17、 KDE 4.8.3、 .xsession

    SimplyMepis 11、 KDE 4.5.3、 .xsession

    回覆刪除
    回覆
    1. .xinitrc好像是用startx時才會呼叫

      刪除
  2. Centos 6.5 Gnome .xsession
    非常實用謝謝

    回覆刪除
  3. 謝謝一下洪老師的這篇文章,原因是:https://goo.gl/5AQcVK

    (我是前幾週在台南 STS 年會後餐宴時向老師攀談使用隨身碟系統經驗的那人)

    回覆刪除
  4. 很實用,解決了困擾我好幾天的問題,謝謝。

    回覆刪除

因為垃圾留言太多,現在改為審核後才發佈,請耐心等候一兩天。