2017-02-13 64 views
0

我想運行一個腳本調用systemd服務不能調用I3 --get-socketpath

i3 --get-socketpath 

然而,它的返回碼始終是1,如果我運行它systemd服務systemd服務,即使它工作(返回代碼爲0),如果我在終端中手動運行ExecStart命令。

/etc/systemd/system/my-script.service

[Service] 
Type=simple 
ExecStart=/usr/bin/python3 /home/my-username/my-script.py 
User=my-username 

[Install] 
WantedBy=multi-user.target 

/home/my-username/my-script.py

import subprocess 

process = subprocess.Popen(['i3', '--get-socketpath'], 
          stdout=subprocess.PIPE, 
          stderr=subprocess.STDOUT) 
returncode = process.wait() 
print('return code: {0}'.format(returncode)) 
print(process.stdout.read()) 

爲什麼服務未能致電i3 --get-socketpath?如何解決它?

+1

這很可能是因爲systemd服務是不一樣的範圍爲X會話內啓動,導致環境變量'DISPLAY'不是定義。嘗試將「env = dict」(os.environ,DISPLAY =「:0」)的關鍵字參數添加到「Popen()」調用中。顯然,這需要'import os',並假定在運行的X會話中'DISPLAY'實際上是':0'。 – Adaephon

+0

謝謝,這是有效的。然而,我沒有提到我實際上喜歡運行一個使用[i3ipc](https://github.com/acrisci/i3ipc-python)的python腳本,它在內部完成了這個調用,而沒有添加關鍵字參數。有其他解決方案嗎? – maiermic

回答

0

由於Adaephon

的systemd服務是不一樣的範圍爲X會話內啓動,導致無法被定義的環境變量DISPLAY

可在服務配置中設置

[Service] 
Type=simple 
Environment=DISPLAY=:0 
ExecStart=/usr/bin/python3 /home/maiermic/tmp/systemd-test.py 
User=maiermic 

[Install] 
WantedBy=multi-user.target