V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
hwhtj
V2EX  ›  Django

请教 Django runserver 开机自启动的问题

  •  
  •   hwhtj ·
    sometech · Jul 23, 2024 · 4782 views
    This topic created in 647 days ago, the information mentioned may be changed or developed.

    /etc/systemd/system/rc-local.service 文件内容:

     Description=/etc/rc.local Compatibility
     ConditionPathExists=/etc/rc.local
    
    [Service]
     Type=forking
     ExecStart=/etc/rc.local start
     TimeoutSec=0
     StandardOutput=tty
     RemainAfterExit=yes
     SysVStartPriority=99
    
    [Install]
     WantedBy=multi-user.target
    

    /etc/rc.local 文件内容

    #!/bin/sh -e
    #
    # rc.local
    #
    # This script is executed at the end of each multiuser runlevel.
    # Make sure that the script will "exit 0" on success or any other
    # value on error.
    #
    # In order to enable or disable this script just change the execution
    # bits.
    #
    # By default this script does nothing.
    echo "看到这行字,说明添加自启动脚本成功。" > /home/some/Qexo/test.log
    a=`lsof -i:8000 | wc -l`
    if [ "$a" -eq "0" ];then
           echo "start nohup django:8000" >> /home/some/Qexo/test.log
                 nohup  /usr/bin/python3 /home/some/Qexo/manage.py runserver 0.0.0.0:8000 > cmdb.log 2>&1 &
           else
           echo "8000 端口被占用" >> /home/some/Qexo/test.log
    fi
    #source/home/some/Qexo/
    #nohup /usr/bin/python3 /home/some/Qexo/manage.py runserver 0.0.0.0:8000 > cmdb.log 2>&1 &
    echo "看到这行字,说明 django.sh 执行过。" >> /home/some/Qexo/test.log
    exit 0
    

    重启后,sudo systemctl status rc-local,报如下错误

     rc-local.service - /etc/rc.local Compatibility
        Loaded: loaded (/etc/systemd/system/rc-local.service; enabled; preset: enabled)
       Drop-In: /usr/lib/systemd/system/rc-local.service.d
                └─debian.conf
        Active: failed (Result: exit-code) since Tue 2024-07-23 09:22:23 CST; 15min ago
      Duration: 236ms
       Process: 3617 ExecStart=/etc/rc.local start (code=exited, status=0/SUCCESS)
      Main PID: 3621 (code=exited, status=1/FAILURE)
           CPU: 344ms
    
    7 月 23 09:22:23 some-Ubuntu23 systemd[1]: Starting rc-local.service - /etc/rc.local Compatibility...
    7 月 23 09:22:23 some-Ubuntu23 systemd[1]: Started rc-local.service - /etc/rc.local Compatibility.
    7 月 23 09:22:23 some-Ubuntu23 systemd[1]: rc-local.service: Main process exited, code=exited, status=1/FAILURE
    7 月 23 09:22:23 some-Ubuntu23 systemd[1]: rc-local.service: Failed with result 'exit-code'.
    
    14 replies    2024-09-10 14:48:25 +08:00
    byaiu
        1
    byaiu  
       Jul 23, 2024
    猜测是 pythonpath 的问题
    依赖是不是全局装的?
    而且不是有 log 么,看看 log 就好了
    Vegetable
        2
    Vegetable  
       Jul 23, 2024
    一方面,你至少把你的 test.log 放出来,免得大家肉眼检查脑内运行帮你看问题。
    另一方面,你这个需求其实很适合将服务放在 dcoker 里边自动启动,全是好处。
    lingeo
        3
    lingeo  
       Jul 23, 2024
    1.直接 bash 运行 rc.local 脚本试一下有没有报错。
    2.推荐你使用 supervisor 管理进程。
    Spute
        4
    Spute  
       Jul 23, 2024
    1 、切到项目目录,以前台模式直接执行/usr/bin/python3 /home/some/Qexo/manage.py runserver 0.0.0.0:8000 ,进行 debug
    2 、建议使用 docker 部署这种 web 服务器
    dolphintwo
        5
    dolphintwo  
       Jul 23, 2024
    写一个 django 的 service 再 enable 它
    lzZzeucJri6FcR0o
        6
    lzZzeucJri6FcR0o  
       Jul 23, 2024
    人才
    hwhtj
        7
    hwhtj  
    OP
       Jul 23, 2024
    我登录 的不是 root 用户。
    直接 sudo bash 运行 rc.local 脚本 成功,
    直接运行/usr/bin/python3 /home/some/Qexo/manage.py runserver 0.0.0.0:8000 ,也会成功,但就是把命令放在 rc.local 里面,再由 systemctl 调用就不成功
    说到最后,我就是想在 ubuntu 启动的时候自动运行/usr/bin/python3 /home/some/Qexo/manage.py runserver 0.0.0.0:8000 --noreload 这么一句脚本,可试了很多方法都不行
    pililink
        10
    pililink  
       Jul 23, 2024
    推荐你使用 supervisor 管理进程
    skyrim61
        11
    skyrim61  
       Jul 24, 2024
    使用 gunicorn 部署
    zcybupt2016
        12
    zcybupt2016  
       Jul 24, 2024
    建议打 docker + 1 ,省事得多
    elboble
        13
    elboble  
       Jul 24, 2024
    supervisor +1 ,或者 unicron ,代拉服务。runserver 是调试用法
    huangzhiyia
        14
    huangzhiyia  
       Sep 10, 2024
    分享一个自己生产环境常用的配置

    1.不要用系统自带的 Python 而是转为使用 venv 之类的虚拟环境

    我一个服务器上跑着不同版本的 Python 环境, 直接从 Debian 10 升级到 Debian 12 没有任何问题,如果用系统自带的 python 肯定 GG 思密达了

    2.在服务器项目目录下执行 python -m venv venv 然后 source venv/bin/activate 激活环境后进行初始化之类的操作

    pip install -r requirements.txt
    python manage.py xxxxxxxxxxx

    3. 最后配置 system service


    ```bash
    [Unit]
    Description=edge-system
    After=network.target

    [Service]
    User=admin
    Group=admin
    CPUQuota=50%
    MemoryLimit=1024M
    WorkingDirectory=/usr/local/edgesystem
    Restart=always
    RestartSec=5
    ExecStart=/usr/local/edgesystem/venv/bin/gunicorn conf.wsgi:application --workers 4 --threads 3 -b 127.0.0.1:8001
    [Install]
    WantedBy=multi-user.target
    ```

    4.最终执行

    systemctl --now enable servicename
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2495 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 81ms · UTC 07:56 · PVG 15:56 · LAX 00:56 · JFK 03:56
    ♥ Do have faith in what you're doing.