把Flask项目通过自定义系统服务部署到Linux服务器

本文介绍了在Linux系统中部署Flask项目时遇到的自定义服务启动超时问题,问题源于服务类型配置错误。通过修正为`Type=simple`解决了问题,并详细解释了Daemon进程的作用和原理,包括为何需要fork子进程以及父进程快速退出的原因。此外,还提供了相关命令以便管理和检查服务状态。
摘要由CSDN通过智能技术生成

主要参考:

【1】部署流程 https://blog.csdn.net/qq_38316655/article/details/115840797

【2】systemd type解析 https://www.cnblogs.com/faberbeta/p/14405920.html

本人在根据教程【1】部署Flask项目时,启动自定义系统服务失败。显示超时

Job for myweb.service failed because a timeout was exceeded. See "systemctl status myweb.service" and "journalctl -xe" for details.

后发现是服务类型写错了。应该写成simple。所以,我们Flask 的自定义服务如下:

[Unit]
Description=myweb
After=network.target
 
[Service]
Type=simple
ExecStart=/usr/bin/python3 /home/octan3/MyCodes/FFF/WebAPI/MyAPI.py 
PrivateTmp=true
 
[Install]
WantedBy=multi-user.target

记录一下常用命令:

sudo vim /usr/lib/systemd/system/myweb.service         #编辑服务
sudo systemctl daemon-reload                                      #重载服务
sudo systemctl start myweb                                           #开始服务
sudo systemctl restart/stop myweb                                #重启、关闭服务
systemctl status myweb                                                 #查看服务状态(错误提示)
ps aux|grep myweb                                                        #查看进程
systemctl is-enabled myweb                                          # 查看服务是否是开机自启动
systemctl enable myweb                                                # 把服务设置为开机自启动

记录一下原理。

大概就是Daemon进程(守护进程)父进程会瞬间消失。但是Flask程序一直在运行,所以没有父进程退出,就超时了。所以如果要设置为 forking,需要在运行命令后面加上&。所以人家教程[1]应该没有问题,是我当时写服务配置时漏写了 &.

为什么要fork一个子进程作为Daemon进程?为什么父进程要立即退出?

所有的Daemon类进程都要脱离Shell脱离终端,才能不受终端不受用户影响,从而保持长久运行。

在代码层面上,脱离Shell脱离终端是通过setsid()创建一个独立的Session实现的,而进程组的首进程(pg leader)不允许创建新的Session自立山头,只有进程组中的非首进程(比如进程组首进程的子进程)才能创建会话,从而脱离原会话。

而Shell命令行下运行的命令,总是会创建一个新的进程组并成为leader进程,所以要让该程序成为长久运行的Daemon进程,只能创建一个新的子进程来创建新的session脱离当前的Shell。

另外,父进程立即退出的原因是可以立即将终端控制权交还给当前的Shell进程。但这不是必须的,比如可以让子进程成为Daemon进程后,父进程继续运行并占用终端,只不过这种代码不友好罢了。

换句话说,当用户运行一个Daemon类程序时,总是会有一个瞬间消失的父进程。


作者: 骏马金龙
链接: https://www.junmajinlong.com/linux/process_relationship/
来源: 骏马金龙
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。、

也就是说,下面应该也可以:

[Unit]
Description=myweb
After=network.target
 
[Service]
Type=forking
ExecStart=/usr/bin/python3 /home/octan3/MyCodes/FFF/WebAPI/MyAPI.py &
PrivateTmp=true
 
[Install]
WantedBy=multi-user.target

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值