systemd 中运行的简单代码退出得太快了吗?

systemd 中运行的简单代码退出得太快了吗?

我在 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 将监听指定的端口并将传入的连接传递给相应的服务,它也将自行启动该服务。

相关内容