通过命令行完美运行,无法通过 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.service。从命令行运行时,可能所有服务都已启动,并且您没有遇到任何问题,但从 开始时,systemd可​​能某些依赖项服务未启动,并且在这些服务启动your butterfly.service之前即将到来。并尝试添加Restart=always到您的[service]部分,这样如果它崩溃了,它应该再次重新启动。

相关内容