目录
一、问题来源
在使用uwsgi+nginx部署django项目时,通常使用下面的命令在对uwsgi进程进行管理
# 进入项目路径
cd /var/www/html/Podcaster
# 开启uwsgi服务
sudo uwsgi --ini uwsgi.ini
# 停止uwsgi服务
sudo uwsgi --stop uwsgi.pid
# 重启uwsgi服务
sudo uwsgi --reload uwsgi.pid
这就会导致一个问题,每次要管理项目时都需要进入项目目录下,而这个目录有点深,于是我就想把它封装为一个服务,类似于nginx的这种
sudo service nginx start
sudo service nginx stop
sudo service nginx reload
二、解决方案
我们可以使用systemctl通过服务的方式进行管理
操作图下
# 创建服务文件
sudo vim /etc/systemd/system/podcaster.service
# 在文件中写入如下内容
[Unit]
Description=Podcaster Service
After=network.target
[Service]
User=root
WorkingDirectory=/var/www/html/Podcaster
ExecStart=uwsgi --ini uwsgi.ini
ExecStop=uwsgi --stop uwsgi.pid
ExecReload=uwsgi --reload uwsgi.pid
Type=forking
Restart=always
[Install]
WantedBy=multi-user.target
参数解释
### 每个参数含义的解释
## Description:描述了该服务的名称或说明。在这个例子中,描述为"Podcaster Service",表示这是一
个用于Podcaster应用的服务。
## After:指定了该服务应该在哪个目标(target)之后启动。在这个例子中,指定
为"network.target",表示该服务应该在网络目标启动之后启动。
## User:指定了服务运行的用户。在这个例子中,指定为"root",表示该服务将以root用户身份运行。
## WorkingDirectory:指定了服务的工作目录。在这个例子中,指定为"/var/www/html/Podcaster",表
示该服务将在该目录下运行。
## ExecStart:指定了服务启动时要执行的命令
## ExecStop:指定了服务停止时要执行的命令
## ExecReload:指定了服务重新加载时要执行的命令
## Restart:指定了服务在发生故障或意外终止时的重启策略。在这个例子中,指定为"always",表示服务
将始终被重启。
## WantedBy:指定了该服务应该被安装到哪个目标(target)。在这个例子中,指定为"multi-
user.target",表示该服务将被安装到多用户目标
保存后,如果我们想要启用服务,可以这么操作
sudo systemctl enable podcaster
开启服务
sudo systemctl start podcaster
停止服务
sudo systemctl stop podcaster
重启服务
sudo systemctl reload podcaster
最后,我们可以通过下面的命令注销服务
sudo systemctl disable podcaster
三、补充资料
由于我这个涉及到了uwsgi的服务,这里写一下uwsgi的常用命令,留作学习笔记,防止忘记
查看当前的uwsgi进程信息
ps aux | grep uwsgi
查看某个uwsgi进程的详细信息
sudo cat /proc/<uwsgi.pid>/cmdline
停止每个pid的uwsgi进程
sudo kill <uwsgi.pid>
发送终止信号
sudo kill -SIGTERM 761525
如果uwsgi进程没有正常终止,你可以尝试使用强制终止信号SIGKILL
。运行以下命令:
sudo kill -SIGKILL 761525
请注意,使用强制终止信号可能会导致进程无法进行清理操作,因此请谨慎使用。
一条龙服务
ps aux | grep uwsgi && sudo cat /proc/761525/cmdline && sudo kill 761525
四、补充
经过上面的systemctl服务配置后,仍然存在一个小小的问题,就是我是用 sudo systemctl stop podcaster 命令后台的那个uwsgi服务并没有真正的停止,这个问题我目前还没有解决,可能是受到了uwsgi --stop uwsgi.pid的影响,它并不能真正的停止uwsgi,我目前的解决方案是直接使用
sudo systemctl disable podcaster
来强制停止,随谈可以停止服务,但是那两个stop/reload的命令就失效了,我国各位看官大佬知道怎么解决,还请在评论区留言指导一下,谢谢!!!