2 回答

TA貢獻1839條經(jīng)驗 獲得超15個贊
該xset
命令只是 X 服務器的客戶端。它通過檢查DISPLAY
環(huán)境變量來確定要與哪個 X 服務器通信,當您將命令作為系統(tǒng)服務運行時不會設置該變量。
即使您DISPLAY
在運行守護程序時確保已設置,它也可能以不同的用戶帳戶運行,并且默認情況下拒絕訪問顯示。
更好的選擇是將您的守護程序作為用戶會話的一部分運行。這將解決身份驗證問題(它將像您一樣運行)和定位顯示的能力(環(huán)境變量應該是可見的)。當您未登錄時,守護程序將不會運行,但這對于此特定用例可能無關緊要。
您已將問題標記為“Ubuntu”,其中會話仍由Upstart管理。您可以通過在~/.config/upstart
. 文件格式的詳細信息可以在init(5)
手冊頁中找到。

TA貢獻1805條經(jīng)驗 獲得超10個贊
根據(jù) David Budworth 的評論,修復方法非常簡單;由于服務在 root 下運行,它沒有設置 DISPLAY 環(huán)境變量。
在 go 中,您可以在使用 exec 時設置環(huán)境變量,如下所示:
//execute screens off command
cmd := exec.Command("xset", "-display", ":0", "dpms", "force", "off")
cmd.Env = []string{"DISPLAY=:0"} // set the display before executing
stdout, stderr := cmd.CombinedOutput() //execute and return all output
從 James Henstridge 的回答中我發(fā)現(xiàn)我還需要運行xhost +SI:localuser:root以允許 root 用戶訪問 X 服務器。
您可以在用戶登錄后通過將此行添加到/etc/profile文件頂部來為他們執(zhí)行此操作
xhost +SI:localuser:root > /dev/null 2>&1
或者
即使沒有用戶登錄(顯示登錄屏幕時),您也可以使用它
首先我創(chuàng)建了目錄/opt/scripts 然后創(chuàng)建了文件/opt/scripts/xhost.sh 并賦予它可執(zhí)行權限chmod +x /opt/scripts/xhost.sh
在這個文件中只有一行:
xhost +SI:localuser:root > /dev/null 2>&1
然后編輯文件/etc/lightdm/lightdm.conf(我必須創(chuàng)建它,但如果它在那里就編輯它)并添加行 display-setup-script=/opt/scripts/xhost.sh
所以我的lightdm.conf文件看起來像這樣:
[SeatDefaults]
greeter-session=unity-greeter
user-session=ubuntu
display-setup-script=/opt/scripts/xhost.sh
這告訴 LightDM(在 Ubuntu 中運行的顯示管理器)/opt/scripts/xhost.sh在 X 服務器啟動之后但在其他任何事情之前運行腳本,因此 root 立即獲得 xhost 授權!
筆記:
display-setup-script 在 X 服務器啟動之后但在用戶會話/歡迎程序運行之前運行。如果您需要在 X 服務器中配置任何特殊內(nèi)容,請設置此項。它以 root 身份運行。如果此命令返回錯誤代碼,則 X 服務器將停止。 來源:https : //wiki.ubuntu.com/LightDM
- 2 回答
- 0 關注
- 234 瀏覽
添加回答
舉報