![通过命令行完美运行,无法通过 systemd ExecStart 运行](https://linux22.com/image/36000/%E9%80%9A%E8%BF%87%E5%91%BD%E4%BB%A4%E8%A1%8C%E5%AE%8C%E7%BE%8E%E8%BF%90%E8%A1%8C%EF%BC%8C%E6%97%A0%E6%B3%95%E9%80%9A%E8%BF%87%20systemd%20ExecStart%20%E8%BF%90%E8%A1%8C.png)
我已经安装了蝴蝶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.service
。从命令行运行时,可能所有服务都已启动,并且您没有遇到任何问题,但从 开始时,systemd
可能某些依赖项服务未启动,并且在这些服务启动your butterfly.service
之前即将到来。并尝试添加Restart=always
到您的[service]
部分,这样如果它崩溃了,它应该再次重新启动。