透過命令列完美運行,無法透過 systemd ExecStart 運行

透過命令列完美運行,無法透過 systemd ExecStart 運行

我已經安裝了蝴蝶http終端伺服器,在我的 Arch 機器上用 python 寫。我是 systemd 新手,但我遇到了命令列參數之一的問題。

/usr/bin/butterfly.server.py --shell=/usr/fish --unsecure --host="0.0.0.0"

這按預期工作,我可以透過另一台電腦上的網頁瀏覽器存取終端。

但是,當我為其建立一個簡單的 systemd .service 時:

[Unit]
Description=Butterfly Terminal Server

[Service]
ExecStart=/usr/bin/butterfly.server.py --shell=/bin/fish --host="0.0.0.0" --unsecure

[Install]
WantedBy=multi-user.target

它不會--host="0.0.0.0"在 ExecStart 行中開始,並報告:

[root@ArchHP sockets.target.wants]# systemctl status butterfly.service -l
● butterfly.service - Butterfly Terminal Server
   Loaded: loaded (/usr/lib/systemd/system/butterfly.service; enabled; vendor preset: disabled)
   Active: failed (Result: exit-code) since Wed 2015-01-07 23:08:29 CST; 26s ago
  Process: 3203 ExecStart=/usr/bin/butterfly.server.py --shell=/bin/fish --host="0.0.0.0" --unsecure (code=exited, status=1/FAILURE)
 Main PID: 3203 (code=exited, status=1/FAILURE)

Jan 07 23:08:28 ArchHP butterfly.server.py[3203]: File "/usr/lib/python3.4/site-packages/tornado/tcpserver.py", line 125, in listen
Jan 07 23:08:28 ArchHP butterfly.server.py[3203]: sockets = bind_sockets(port, address=address)
Jan 07 23:08:28 ArchHP butterfly.server.py[3203]: File "/usr/lib/python3.4/site-packages/tornado/netutil.py", line 106, in bind_sockets
Jan 07 23:08:28 ArchHP butterfly.server.py[3203]: 0, flags)):
Jan 07 23:08:28 ArchHP butterfly.server.py[3203]: File "/usr/lib/python3.4/socket.py", line 530, in getaddrinfo
Jan 07 23:08:28 ArchHP butterfly.server.py[3203]: for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
Jan 07 23:08:28 ArchHP butterfly.server.py[3203]: socket.gaierror: [Errno -2] Name or service not known
Jan 07 23:08:29 ArchHP systemd[1]: butterfly.service: main process exited, code=exited, status=1/FAILURE
Jan 07 23:08:29 ArchHP systemd[1]: Unit butterfly.service entered failed state.
Jan 07 23:08:29 ArchHP systemd[1]: butterfly.service failed.

如果我隨後刪除--host="0.0.0.0",它將成功啟動,但只能在我的本機電腦上存取 - 其他電腦將不會被授予存取權限。然後我嘗試為該服務建立一個butterfly.socket,但在尋找錯誤訊息方面沒有成功。

為什麼透過 ExecStart 運行它與在命令列中運行它有什麼不同,以及如何使用該參數啟動它?作為最後的手段,我可​​以嘗試修改 python 腳本以預設為0.0.0.0,但我想了解為什麼我sudo systemctl restart butterfly.service在直接執行時收到錯誤但沒有。

答案1

當您從shell啟動butterfly時,它會刪除 周圍的引號0.0.0.0。另一方面,systemd 在這種情況下不會進行引號擴展,因為它不是 shell。

實際上,systemd 能夠去除引號大約爭論,但不在爭論中間。

因此,請嘗試刪除0.0.0.0服務文件中的引號並查看發生了什麼變更。不要忘記systemctl daemon-reload

PS:僅僅透過編寫 .socket 單元並不能神奇地使守護程序套接字可啟動。必須更改其代碼以支援套接字啟動。

答案2

我猜您有一些依賴項來運行您的butterfly.servicesystemd並且在這些服務啟動your butterfly.service之前即將Restart=always到來[service]

相關內容