python项目virtualenv环境部署正式项目和后台运行实践

您所在的位置:网站首页 python的virtualenv python项目virtualenv环境部署正式项目和后台运行实践

python项目virtualenv环境部署正式项目和后台运行实践

2024-07-08 18:14| 来源: 网络整理| 查看: 265

pycharm创建virtualenv环境的项目:

在本地虚拟环境项目路径下生成依赖包记录文件,然后上传到linux 服务器项目路径下:

注意注意:要在虚拟环境中生成,才能将所有的项目依赖包构建在 requirements.txt文件中。

pip3 freeze > requirements.txt

 linux服务器上安装virtualenv环境:

设置国内(清华)镜像源和升级pip:

pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

升级pip: python -m pip install --upgrade pip 

#开始安装虚拟环境

方式一:

# python3 的 pip3 pip3 install virtualenv # 创建环境venv virtualenv venv

方式二:

python3 -m venv venv

如果报错按照命令安装所需软件即可

# 启用此环境,后续命令行前面出现(venv)代表此时环境已切换, source ./venv/bin/activate # 之后执行pip python3 等指令,相当于是在此环境中执行 # 虚拟环境中安装项目的依赖包 pip3 install -r ./requirements.txt # 此时看到依赖已安装, pip3 list

#上传项目的其他文件到服务器,venv目录就不用传服务器 # 然后运行项目 python3 main.py # 或后台运行项目 nohup python3 main.py >nohup.out 2>&1 &

#退出虚拟环境(如果是后台运行的项目,退出虚拟环境后项目仍然是在运行的) deactivate

/**************************************************************************/

python项目启动脚本run.sh:

#!/bin/bash

#应用入口文件 APP_NAME=/www/wwwroot/webpython/main.py #virtualenv虚拟环境启动命令 VENV_START=/www/wwwroot/webpython/venv/bin/activate

#使用说明,用来提示输入参数 usage(){     echo "Usage: sh run.sh [start|stop|restart|status]" }

#检查程序是否在运行 is_exist(){     pid=`ps -ef|grep $APP_NAME|grep -v grep|awk '{print $2}'`     if [ -z "${pid}" ];then         return 1     else         return 0     fi }

#启动方法 start(){     is_exist     if [ $? -eq 0 ];then         echo "${APP_NAME} is already running. pid=${pid}"     else         source ${VENV_START}         nohup python3 ${APP_NAME} >nohup.out 2>&1 &     fi     }

#停止方法 stop(){   is_exist   if [ $? -eq "0" ]; then     kill -9 $pid   else     echo "${APP_NAME} is not running"   fi   }

#输出运行状态 status(){   is_exist   if [ $? -eq "0" ]; then     echo "${APP_NAME} is running. Pid is ${pid}"   else     echo "${APP_NAME} is NOT running."   fi }

#重启方法 restart(){   stop   sleep 5   start }   #根据输入参数,选择执行对应方法,不输入则执行使用说明 case "$1" in   "start")     start     ;;   "stop")     stop     ;;   "status")     status     ;;   "restart")     restart     ;;   *)     usage     ;; esac

/*************************************************************************/

&符号

这两天要在服务器端一直运行一个Python脚本,当然就想到了在命令后面加&符号

$ python /data/python/server.py >python.log &

说明: 1、 > 表示把标准输出(STDOUT)重定向到 那个文件,这里重定向到了python.log 2、 & 表示在后台执行脚本 这样可以到达目的,但是,我们退出shell窗口的时候,必须用exit命令来退出,否则,退出之后,该进程也会随着shell的消失而消失(退出、关闭)

使用nohup(not hang up)

$ nohup python /data/python/server.py > python.log3 2>&1 &

说明: 1、1是标准输出(STDOUT)的文件描述符,2是标准错误(STDERR)的文件描述符1> python.log 简化为 > python.log,表示把标准输出重定向到python.log这个文件 2、2>&1 表示把标准错误重定向到标准输出,这里&1表示标准输出 为什么需要将标准错误重定向到标准输出的原因,是因为标准错误没有缓冲区,而STDOUT有。 这就会导致 commond > python.log 2> python.log 文件python.log被两次打开,而STDOUT和 STDERR将会竞争覆盖,这肯定不是我门想要的 3、好了,我们现在可以直接关闭shell窗口(我用的是SecureCRT,用的比较多的还有Xshell),而不用再输入exit这个命令来退出shell了  

$ ps aux|grep python tomener 1885 0.1 0.4 13120 4528 pts/0 S 15:48 0:00 python /data/python/server.py tomener 1887 0.0 0.0 5980 752 pts/0 S+ 15:48 0:00 grep python

现在当我们直接关闭shell窗口,再连接上服务器,查看Python的进程,发现进程还在

但是,在python运行中却查看不到输出!

因为:

python的输出有缓冲,导致python.log3并不能够马上看到输出。

使用-u参数,使得python不启用缓冲。

所以改正命令,就可以正常使用了

$ nohup python -u test.py > out.log 2>&1 & nohup和&的区别 & : 指在后台运行nohup : 不挂断的运行,注意并没有后台运行的功能,,就是指,用nohup运行命令可以使命令永久的执行下去,和用户终端没有关系,例如我们断开SSH连接都不会影响他的运行,注意了nohup没有后台运行的意思;&才是后台运行

&是指在后台运行,但当用户推出(挂起)的时候,命令自动也跟着退出

那么,我们可以巧妙的吧他们结合起来用就是nohup COMMAND & 这样就能使命令永久的在后台执行

例如: 1.sh test.sh & 将sh test.sh任务放到后台 ,即使关闭xshell退出当前session依然继续运行,但标准输出和标准错误信息会丢失(缺少的日志的输出)

将sh test.sh任务放到后台 ,关闭xshell,对应的任务也跟着停止。

nohup sh test.sh 将sh test.sh任务放到后台,关闭标准输入,终端不再能够接收任何输入(标准输入),重定向标准输出和标准错误到当前目录下的nohup.out文件,即使关闭xshell退出当前session依然继续运行。nohup sh test.sh & 将sh test.sh任务放到后台,但是依然可以使用标准输入,终端能够接收任何输入,重定向标准输出和标准错误到当前目录下的nohup.out文件,即使关闭xshell退出当前session依然继续运行。 任务前后台的切换

shell支持作用控制,有以下命令实现前后台切换:

command &让进程在后台运行jobs 查看后台运行的进程fg %n 让后台运行的进程n到前台来bg %n 让进程n到后台去kill %n 杀死job PS: “n” 为jobs命令查看到的job编号,不是进程编号.   fg、bg、jobs、&、ctrl + z 都是跟系统任务有关的 一、&

这个用在一个命令的最后,可以把这个命令放到后台执行

python test.py & 二、ctrl + z

可以将一个正在前台执行的命令放到后台,并且暂停

三、jobs

查看当前有多少在后台运行的命令

jobs [1]- Stopped vim ~/.bash_profile [2]+ Stopped vim /etc/profile 四、fg

将后台中的命令调至前台继续运行 如果后台中有多个命令,可以用 fg %jobnumber将选中的命令调出,%jobnumber是通过jobs命令查到的后台正在执行的命令的序号(不是pid)。

fg %1 五、bg

将一个在后台暂停的命令,变成继续执行 如果后台中有多个命令,可以用bg %jobnumber将选中的命令调出,%jobnumber是通过jobs命令查到的后台正在执行的命令的序号(不是pid)。

bg %1 [1]+ vim ~/.bash_profile & [1]+ Stopped vim ~/.bash_profile 六、kill

杀死jobs中具体jobnumber

jobs [1]+ Stopped vim ~/.bash_profile [2]- Stopped vim /etc/profile 杀死 jobnumber=1: kill %1 [1]+ Stopped vim ~/.bash_profile 在查询下jobs: jobs [2]+ Stopped vim /etc/profile 补充

最近使用nohup创建了一个后台进程,默认日志输出到了nohup.out文件中,程序跑起来也就没再管, 过了大约一周,发现硬盘空间不够了,于是查找原因,发现这个nohup.out文件已经到了70G了,导致硬 盘空间不足了。 解决方案 :

只输出错误信息到日志文件

nohup ./program >/dev/null 2>log &

什么信息也不要

nohup ./program >/dev/null 2>&1 &


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3