如何使 /etc/init.d 腳本像在 X 下啟動一樣?
我試圖通過 /etc/init.d 中的啟動腳本啟動時行為異常的 Java 應用程序找出一些怪癖,但是當您打開 GUI 終端視窗並通過 /etc/init.d/ 執行它時執行良好我的應用程序開始。(古怪之處在於應用程序的一部分對 X 進行了一些 hacky handwaving。)由於應用程序在通過終端視窗啟動時執行良好,我正在研究它是如何啟動的,然後再深入研究(誠然是微妙的,而不是我的)原始碼。
這篇文章的答案給了我一個線索,即 Gnome 終端正在視窗管理器中執行,這在某種程度上影響(以一種好的方式)我通過 bash 腳本啟動的應用程序的環境。我能夠驗證通過 tty 終端(ctrl-alt-f1 或通過 ssh)啟動腳本與啟動時啟動的行為相同。
**我的主要問題:**當電腦啟動時我能做些什麼來啟動這個應用程序,但它的行為就像它是在 X 下啟動的一樣?到目前為止,我們已經將腳本路由向上,因為它還需要使用某些參數啟動 Java VM。
後續問題(嚴格來說是為了加深我的理解):當腳本通過在視窗管理器中執行的東西啟動時,幕後發生了什麼使腳本的行為有所不同?Google並沒有讓我明白這一點。
如果您的應用程序出於某種奇怪的原因需要 X 伺服器,但對它沒有做任何有用的事情,請給它一個虛擬 X 伺服器。這通常用於在 Web 應用程序的自動化測試套件中執行 Web 瀏覽器——沒有人在看螢幕,但沒有一個 Web 瀏覽器將無法執行。
Xvfb創建了一個 X 伺服器,它只“顯示”到記憶體,而不是任何可見的東西。它不需要任何硬體或權限。
使用它的最簡單方法是通過 Debian
xvfb-run
腳本。xvfb-run java MyWeirdApp
如果您沒有
xvfb-run
,請從網路上的多個副本之一或Debian 軟體包中獲取。
/etc/init.d
腳本是非互動式的、非登錄的,並且它們不會嘗試訪問 X 會話,因為它們是系統範圍的服務。1 系統服務不與任何特定的登錄使用者相關聯,2但 X 會話始終屬於已登錄使用者。如果您的應用程序需要 GUI 上下文才能工作,那麼它不應該是系統服務。您還沒有解釋它為什麼需要它或它做了什麼,但很可能您應該使用
~/.xinitrc
或您的桌面環境的啟動系統,而不是 init。1 X 應用程序和登錄使用者可能會使用系統服務,但您所說的恰恰相反。
2服務通常與它們自己的特殊使用者相關聯,但它們並沒有 以這種方式登錄(通常這些使用者無法登錄)。