python项目virtualenv环境部署正式项目和后台运行实践 |
您所在的位置:网站首页 › python的virtualenv › python项目virtualenv环境部署正式项目和后台运行实践 |
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目录就不用传服务器 # 然后运行项目 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 |