第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Linux display 命令在終端中有效,但在 systemd 服務中無效

Linux display 命令在終端中有效,但在 systemd 服務中無效

Go
桃花長相依 2021-11-29 16:08:06
我制作了一個網(wǎng)絡應用程序來關閉我的電腦屏幕,有幾種不同的技術,但它相當簡單:我有一個 html/js 前端,它檢測按鈕點擊(屏幕開啟/屏幕關閉),它通過 ajax 將選項發(fā)送到 PHP 后端然后 php 通過 tcp 端口連接,將選項發(fā)送到用 golang 編寫的程序然后我的 golang 程序執(zhí)行關閉/打開屏幕的命令。它運行的命令是 ("xset -display :0 dpms force off")我遇到的問題是該命令僅在我在終端中運行 golang 程序時才有效,但是當我將其設置為服務時,該命令將不起作用。這是golang代碼:package mainimport (    "os/exec"    "net"    "fmt"    "bufio")func main() {    fmt.Println("Launching server")    ln, _ := net.Listen("tcp", ":7777")    fmt.Println("Listening...\n")    for {        // accept connection on port        conn, _ := ln.Accept()        fmt.Println("New connection")        // listen for message ending in \n        message, _ := bufio.NewReader(conn).ReadString('\n')        rec := string(message)        // remove trailing \n        rec = rec[:len(rec)-1]        fmt.Println("Message Received: ", "\""+rec+"\"")        returnMessage := "fail"        if (rec == "screensOff") {            fmt.Println("Turning off screens...")            //execute screens off command            cmd := exec.Command("xset", "-display", ":0", "dpms", "force", "off")            stdout, err := cmd.Output()            if err != nil {                fmt.Println(err.Error())            } else {                fmt.Println(string(stdout))                returnMessage = "done"            }        } else if (rec == "screensOn") {            fmt.Println("Turning on screens...");            //execute screens on command            cmd := exec.Command("xset", "-display", ":0", "dpms", "force", "on")            stdout, err := cmd.Output()            if err != nil {                fmt.Println(err.Error())            } else {                fmt.Println(string(stdout))                returnMessage = "done"            }            returnMessage = "done"        }         conn.Write([]byte(returnMessage + "\n"))        conn.Close()        fmt.Println("Connection closed\n")    }}
查看完整描述

2 回答

?
紫衣仙女

TA貢獻1839條經(jīng)驗 獲得超15個贊

xset命令只是 X 服務器的客戶端。它通過檢查DISPLAY環(huán)境變量來確定要與哪個 X 服務器通信,當您將命令作為系統(tǒng)服務運行時不會設置該變量。

即使您DISPLAY在運行守護程序時確保已設置,它也可能以不同的用戶帳戶運行,并且默認情況下拒絕訪問顯示。

更好的選擇是將您的守護程序作為用戶會話的一部分運行。這將解決身份驗證問題(它將像您一樣運行)和定位顯示的能力(環(huán)境變量應該是可見的)。當您未登錄時,守護程序將不會運行,但這對于此特定用例可能無關緊要。

您已將問題標記為“Ubuntu”,其中會話仍由Upstart管理。您可以通過在~/.config/upstart. 文件格式的詳細信息可以在init(5)手冊頁中找到。


查看完整回答
反對 回復 2021-11-29
?
holdtom

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


查看完整回答
反對 回復 2021-11-29
  • 2 回答
  • 0 關注
  • 234 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號