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 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 COMMAND &
这样就能使命令永久的在后台执行
例如:
1.sh test.sh &
将sh test.sh任务放到后台 ,即使关闭xshell退出当前session依然继续运行,但标准输出和标准错误信息会丢失(缺少的日志的输出)
将sh test.sh任务放到后台 ,关闭xshell,对应的任务也跟着停止。
nohup sh test.sh
nohup sh test.sh &
sh test.sh
任务放到后台,但是依然可以使用标准输入,终端能够接收任何输入,重定向标准输出和标准错误到当前目录下的nohup.out文件,即使关闭xshell退出当前session依然继续运行。shell支持作用控制,有以下命令实现前后台切换:
command &
让进程在后台运行jobs
查看后台运行的进程fg %n
让后台运行的进程n到前台来bg %n
让进程n到后台去kill %n
杀死jobfg
、bg
、jobs
、&
、ctrl + z
都是跟系统任务有关的这个用在一个命令的最后,可以把这个命令放到后台执行
python test.py &
可以将一个正在前台执行的命令放到后台,并且暂停
查看当前有多少在后台运行的命令
jobs
[1]- Stopped vim ~/.bash_profile
[2]+ Stopped vim /etc/profile
将后台中的命令调至前台继续运行
如果后台中有多个命令,可以用 fg %jobnumber将选中的命令调出,%jobnumber是通过jobs命令查到的后台正在执行的命令的序号(不是pid)。
fg %1
将一个在后台暂停的命令,变成继续执行
如果后台中有多个命令,可以用bg %jobnumber将选中的命令调出,%jobnumber是通过jobs命令查到的后台正在执行的命令的序号(不是pid)。
bg %1
[1]+ vim ~/.bash_profile &
[1]+ Stopped vim ~/.bash_profile
杀死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 &