You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何让Ubuntu服务器上的Web服务后台运行,避免终端关闭中断

解决方案:让Django服务在Ubuntu后台持久运行

我来帮你解决这个问题——你遇到的是典型的终端关闭后后台进程被终止的问题,原因是当你关闭SSH终端时,当前shell会给所有子进程发送SIGHUP信号,默认情况下进程会响应这个信号退出。下面给你几种实用的解决方案,从简单快速到生产级规范排序:

方法一:用nohup快速实现持久化

这是最快捷的临时解决方案,适合测试场景:

  1. 正常SSH登录服务器后,执行你的环境准备命令:
    cd chn
    source bin/activate
    cd chn
    
  2. nohup启动Django服务,并把输出重定向到日志文件:
    nohup python3 manage.py runserver 你的IP:80 > django_server.log 2>&1 &
    
    • nohup会让进程忽略SIGHUP信号,终端关闭后进程继续运行
    • > django_server.log 2>&1会把标准输出和错误输出都写入日志文件,方便后续排查问题
  3. 执行exit正常退出SSH会话(不要直接关终端),进程就会留在后台运行了。

你可以用ps aux | grep python3查看进程是否还在,用cat django_server.log查看服务日志。

方法二:用screen创建可复用的会话

如果需要时不时重新连接查看服务输出,screen是更好的选择,Ubuntu 14.0默认已经安装:

  1. SSH登录后,创建一个名为django_chn的screen会话:
    screen -S django_chn
    
  2. 在这个会话里执行你的服务启动命令:
    cd chn
    source bin/activate
    cd chn
    python3 manage.py runserver 你的IP:80
    
  3. Ctrl+A+D组合键** detach(脱离)**这个会话,此时你可以正常关闭终端。
  4. 下次登录服务器后,执行以下命令重新连接会话:
    screen -r django_chn
    
    如果会话存在多个,用screen -ls查看列表,再指定会话ID连接。

方法三:用systemd创建系统服务(生产环境推荐)

如果需要服务稳定运行、开机自启,推荐用系统服务管理,Ubuntu 14.04可以通过安装systemd来使用(或者用原生的upstart,但systemd更通用):

  1. 创建服务配置文件/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  # 设置为多用户模式下开机自启
    
  2. 重新加载systemd配置并启动服务:
    systemctl daemon-reload
    systemctl start django-chn
    
  3. 设置开机自启:
    systemctl enable django-chn
    
  4. 常用管理命令:
    • 查看服务状态:systemctl status django-chn
    • 查看服务日志:journalctl -u django-chn -f(实时查看日志)
    • 停止服务:systemctl stop django-chn

为什么之前的&不行?

你之前在命令后加&只是让进程在当前shell的后台运行,但进程仍然属于当前SSH会话的子进程。当你关闭终端时,shell会给所有子进程发送SIGHUP信号,默认进程会收到信号后终止。上面的几种方法都是通过忽略信号、脱离会话或者由系统进程托管的方式,避免了这个问题。

内容的提问来源于stack exchange,提问作者Cohen

火山引擎 最新活动