我正在尝试为我的 python-flask-socketio 服务器创建自动启动服务。
我需要通过systemd启动一个python脚本。这是我的服务代码:
[Unit]
Description=AppName
[Service]
Type=forking
ExecStart=/usr/bin/python3 /opt/myapp/app.py
[Install]
WantedBy=multi-user.target
如果我尝试使用
sudo service myservice start
手动启动它 - 它工作得很好。它会停止我的终端\ssh 窗口,但我可以关闭它并且它按预期工作。
但是当我重新启动电脑时,它无法启动。当使用
systemctl status myservice
检查其状态时,我得到以下信息:
systemd[1]: Starting My Service...
systemd[1]: myserivce.service: Start operation timed out. Terminating.
systemd[1]: Failed to start My Service.
systemd[1]: myserivce.service: Unit entered failed state.
systemd[1]: myserivce.service: Failed with result 'timeout'.
我在这里做错了什么?
您的类型似乎错误,分叉适用于立即自行分离的程序。 Flask 没有,它保持连接到您的控制台。
您的服务类型可能应该是
simple
设置更大的启动超时:
[Service]
TimeoutStartSec=300
如果您的服务实际上需要更多时间来完成启动。
你必须检查/var/log/message。
启动服务后,如果你的脚本一开始正常工作,然后失败了,请尝试这个。
ExecStart=/usr/bin/bash -c '/usr/bin/python3 /opt/myapp/app.py'
在我的特定情况下,我也有一个 Flask 应用程序并遇到了相同的错误,但它最初使用分叉类型工作,但最近在重新部署新容器后停止工作。 就我而言,问题在于 PIDFile 属性指向不再存在的先前容器。
在本节中: [服务]
有一个像这样的属性导致了我的问题:
PIDFile=/run/user/1000/containers/overlay-containers/b20a186570e8d177d86a649bab2a81c739ccea9bf5a157b5ea443700871587cf/userdata/conmon.pid
我能够通过运行命令找到正确的容器名称:
podman ps
然后我抓取了显示的容器 ID 的第一部分,然后将其与此位置中列出的相应子目录进行匹配:
/run/user/1000/containers/overlay-containers
将其更新为正确的容器 ID 后,我单独保留 fork 类型,运行命令:
systemctl --user daemon-reload
systemctl --user start [containername]
现在它按预期运行,并且不再认为它仍在启动而超时。
我真的花了一个小时才弄清楚这一点:o