如何让Ubuntu服务器上的Web服务后台运行,避免终端关闭中断
解决方案:让Django服务在Ubuntu后台持久运行
我来帮你解决这个问题——你遇到的是典型的终端关闭后后台进程被终止的问题,原因是当你关闭SSH终端时,当前shell会给所有子进程发送SIGHUP信号,默认情况下进程会响应这个信号退出。下面给你几种实用的解决方案,从简单快速到生产级规范排序:
方法一:用nohup快速实现持久化
这是最快捷的临时解决方案,适合测试场景:
- 正常SSH登录服务器后,执行你的环境准备命令:
cd chn source bin/activate cd chn - 用
nohup启动Django服务,并把输出重定向到日志文件:nohup python3 manage.py runserver 你的IP:80 > django_server.log 2>&1 &nohup会让进程忽略SIGHUP信号,终端关闭后进程继续运行> django_server.log 2>&1会把标准输出和错误输出都写入日志文件,方便后续排查问题
- 执行
exit正常退出SSH会话(不要直接关终端),进程就会留在后台运行了。
你可以用ps aux | grep python3查看进程是否还在,用cat django_server.log查看服务日志。
方法二:用screen创建可复用的会话
如果需要时不时重新连接查看服务输出,screen是更好的选择,Ubuntu 14.0默认已经安装:
- SSH登录后,创建一个名为
django_chn的screen会话:screen -S django_chn - 在这个会话里执行你的服务启动命令:
cd chn source bin/activate cd chn python3 manage.py runserver 你的IP:80 - 按
Ctrl+A+D组合键** detach(脱离)**这个会话,此时你可以正常关闭终端。 - 下次登录服务器后,执行以下命令重新连接会话:
如果会话存在多个,用screen -r django_chnscreen -ls查看列表,再指定会话ID连接。
方法三:用systemd创建系统服务(生产环境推荐)
如果需要服务稳定运行、开机自启,推荐用系统服务管理,Ubuntu 14.04可以通过安装systemd来使用(或者用原生的upstart,但systemd更通用):
- 创建服务配置文件
/etc/systemd/system/django-chn.service:[Unit] Description=Django CHN Web Service After=network.target # 网络就绪后启动服务 [Service] User=root # 运行服务的用户,根据你的实际情况调整 WorkingDirectory=/path/to/chn/chn # 替换成你的manage.py所在的绝对路径 Environment="PATH=/path/to/chn/bin" # 替换成虚拟环境bin目录的绝对路径 ExecStart=/path/to/chn/bin/python3 manage.py runserver 你的IP:80 # 完整的python命令路径 Restart=always # 服务意外退出时自动重启 RestartSec=5 # 重启间隔5秒 [Install] WantedBy=multi-user.target # 设置为多用户模式下开机自启 - 重新加载systemd配置并启动服务:
systemctl daemon-reload systemctl start django-chn - 设置开机自启:
systemctl enable django-chn - 常用管理命令:
- 查看服务状态:
systemctl status django-chn - 查看服务日志:
journalctl -u django-chn -f(实时查看日志) - 停止服务:
systemctl stop django-chn
- 查看服务状态:
为什么之前的&不行?
你之前在命令后加&只是让进程在当前shell的后台运行,但进程仍然属于当前SSH会话的子进程。当你关闭终端时,shell会给所有子进程发送SIGHUP信号,默认进程会收到信号后终止。上面的几种方法都是通过忽略信号、脱离会话或者由系统进程托管的方式,避免了这个问题。
内容的提问来源于stack exchange,提问作者Cohen




