我在 xinet d 中运行了这个旧代码库。它基本上是一个简单的 Python 脚本,等待标准输入进入套接字,它会对其进行处理并在标准输出上做出响应。所以我听说 xinetd 不再使用,所以我尝试将其转换为 systemd。我可以获得所有这些设置并执行 systemctl start kosmos(服务名称),但它会立即退出。很好奇我是否在设置中遗漏了什么导致这种情况。我不确定,因为代码是一个非常简单的永久循环,它会监听该标准输入,所以不确定它为什么会在 systemd 上退出。
kosmos.service
[Unit]
Description=Kosmos Guide Camera ICC
After=network.target kosmos.socket
Requires=kosmos.socket
[Service]
ExecStart=/home/workers/miniconda2/bin/python /home/workers/kosmosICC/kcamera/kcamera.py
StandardInput=socket
[Install]
WantedBy=default.target
Kosmos.socket
[Unit]
Description=Socket to KOSMOS for connection
PartOf=kosmos.service
[Socket]
ListenStream=127.0.0.1:30001
[Install]
WantedBy=sockets.target
因此,当我执行此操作时,systemctl start kosmos
没有出现任何错误,但 systemctl status kosmos 显示:
● kosmos.service - Kosmos Guide Camera ICC
Loaded: loaded (/etc/systemd/system/kosmos.service; disabled; vendor preset: disabled)
Active: inactive (dead) since Thu 2021-03-04 17:58:43 EST; 14s ago
Process: 5754 ExecStart=/home/workers/miniconda2/bin/python /home/workers/kosmosICC/kcamera/kcamera.py (code=exited, status=0/SUCCESS)
Main PID: 5754 (code=exited, status=0/SUCCESS)
Mar 04 17:58:42 dhcp-093.apo.nmsu.edu systemd[1]: Started Kosmos Guide Camera ICC.
我没有看到 systemd 可能将日志放在 /var/log 中的什么位置,但也没有看到任何看起来可以提供线索的东西(没有 kosmos.service.log 或任何东西)。我可能正在尝试查找日志以查看 systemd 是否看到代码崩溃(手动运行代码运行良好)
这是尝试运行的代码的主循环片段:
def run():
'''
run for ever listening for standard in
all commands are echoed, whatever reply output, and then
an OK.
'''
while 1:
input = sys.stdin.readline()
try:
run()
except:
print format_exc()
(当然还有更多方法等)但这是主要方法。我怀疑 except 可能被调用,但不确定从该 systemd 服务运行时如何查看 print format_exec()。
编辑:
感谢评论建议,我确实运行了套接字,然后它运行了一点,我可以 telnet 到套接字,但是发送任何数据都导致它死机,尽管它没有说明原因:
journalctl -u kosmos.service -b
Mar 08 15:53:19 dhcp-093.apo.nmsu.edu systemd[1]: Started Kosmos Guide Camera ICC.
Mar 08 15:53:20 dhcp-093.apo.nmsu.edu systemd[1]: Started Kosmos Guide Camera ICC.
Mar 08 15:53:20 dhcp-093.apo.nmsu.edu systemd[1]: Started Kosmos Guide Camera ICC.
Mar 08 15:53:21 dhcp-093.apo.nmsu.edu systemd[1]: Started Kosmos Guide Camera ICC.
Mar 08 15:53:21 dhcp-093.apo.nmsu.edu systemd[1]: Started Kosmos Guide Camera ICC.
Mar 08 15:53:22 dhcp-093.apo.nmsu.edu systemd[1]: start request repeated too quickly for kosmos.service
Mar 08 15:53:22 dhcp-093.apo.nmsu.edu systemd[1]: Failed to start Kosmos Guide Camera ICC.
Mar 08 15:53:22 dhcp-093.apo.nmsu.edu systemd[1]: Unit kosmos.service entered failed state.
Mar 08 15:53:22 dhcp-093.apo.nmsu.edu systemd[1]: kosmos.service failed.
我的服务需要类型吗?或者我的套接字?
在日志中的任何其他地方查看,确保不是我的 Python 代码崩溃(尽管它再次作为 Python 程序正常运行)
答案1
对于套接字激活的服务,您不需要启动服务文件,你启动插座文件。
systemctl enable --now kosmos.socket
现在 systemd 将监听指定的端口并将传入的连接传递给相应的服务,它也将自行启动该服务。