Arch-Linux
通過命令行完美執行,無法通過 systemd ExecStart 執行
我已經在我的 Arch 機器上安裝了用 python 編寫的Butterfly http 終端伺服器。我是 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.
如果我然後 remove
--host="0.0.0.0"
,它將成功啟動,但只能在我的本地電腦上訪問 - 其他電腦將不會被授予訪問權限。然後我嘗試為該服務創建一個 Butterfly.socket,但在查找錯誤消息方面沒有任何成功。為什麼通過 ExecStart 執行它與在命令行中執行它有什麼不同,以及如何使用該參數啟動它?作為最後的手段,我可以嘗試將 python 腳本修改為預設為
0.0.0.0
,但我想了解為什麼我會收到錯誤,sudo systemctl restart butterfly.service
但直接執行時卻沒有。
當您從 shell 啟動蝴蝶時,它會刪除
0.0.0.0
. 另一方面,systemd 在這種情況下不會進行引號擴展,因為它不是 shell。實際上,systemd 能夠去除參數周圍的引號,但不能在它們中間。
因此,請嘗試刪除服務文件中的引號
0.0.0.0
並查看發生了什麼變化。不要忘記systemctl daemon-reload
。PS:您不能僅通過編寫 .socket 單元來神奇地使守護程序套接字可啟動。必須更改其程式碼以支持套接字啟動。