服务器上后台运行python程序

写在最前面

一直是pycharm运行服务器上代码,但存在问题:本机电脑休眠则程序停止运行。但深度学习代码一跑一整天,不小心关了几次后很难受
实习老师向我介绍了nohup,完美解决了这个问题
此外,在服务器上跑代码时,直接在命令行运行代码,常常遇到代码还没跑完却因为网络不稳定等异常终止的问题,所以可以通过nohup指令将代码后台执行,也便于同时运行多个程序。

还可以用它来下载torch那种,需要安装几个小时的包

参考:https://blog.csdn.net/huavhuahua/article/details/121145512
https://blog.csdn.net/m0_38024592/article/details/103336210
https://blog.csdn.net/Yonggie/article/details/120267134

环境

安装nohup

pip install nohup

直接run代码报错:nohup: failed to run command `python3‘: No such file or directory
注意:还是要切换到相应的conda环境下,然后cd到代码目录,最后run代码

代码示例

nohup后台执行,忽略输入并将输出保存到指定文件

nohup python -u myfile.py >> myresult.out 2>&1 &

其中,myfile.py为需要运行的程序,myresult.out为输出文件,myresult.out默认与.py文件保存在同一路径下。

python指令也可以换成其他程序执行指令来运行其他语言的程序,其余不变

nohup后台执行py文件,并将执行的正常日志和错误日志都输入到myresult2.out中

-u 参数,使得python不启用缓冲。解决python的输出有缓冲,导致nohup.out并不能够马上看到输出的问题。

nohup指令

nohup指不断地运行,是no hang up的缩写,指不间断,不挂断。运行一个进程的时候,不想让其在你退出账号时关闭,即可用nohup。

nohup在不规定的情况下,所以输出内容会到nohup.out中

& 后台运行

&为后台运行
使用 & 在程序结尾来让程序自动运行。

2>&1 错误内容重定向到标准输出

0 表示stdin标准输入,用户键盘输入的内容
1 表示stdout标准输出,输出到显示屏的内容
2 表示stderr标准错误,报错内容
2>&1 是一个整体,> 左右不能有空格,即将错误内容重定向输入到标准输出中去。

下面两条代码相同,只是1(标准输入)被省略了,而后面的my.log 2>&1 又将2(错误内容)输入到标准输出,然后前面的标准输出又输入到my.log中,意思错误和标准内容都会输出到my.log中

nohup python my.py >> my.log 2>&1 &
nohup python my.py 1 >> my.log 2>&1 &

以python环境不间断的运行myfile.py这个脚本,并且将脚本输出的内容重定向输入my.log中(>>意为追加,如果用>会让其中的内容清空)

nohup python my.py >> my.log 2>&1 &

代码可拆成两块。即:

# 等价于下面两行的内容
nohup python my.py 1>> my.log &
nohup python my.py 2>> my.log &
  • 上面代码就是将错误和标准都输出到my.log,最初的代码只是简化了。
    假如为2>1,那就是将错误内容输出到文件1中
    加2>&1中的&是为了区别文件1和1(标准输出)
  • nohup tomcat.sh > /dev/null 2>&1 & 也是一样的,将错误和标准全部丢入/dev/null 中,全部销毁。

查看当前python相关进程

Linux可以通过ps指令相关参数查看各种进程,但查看所有进程往往等于大海捞针,所以查看python相关进程在运行代码时更为实用

ps -ef |grep python

在这里插入图片描述

可以看到当前有两个程序正在运行,进程号分别为2173876和2183310

结束进程

如果不想某个程序继续执行了,可以结束进程

kill -9 <进程号>

nohup后台pip下载安装

同理
终端如果直接pip install,关闭中断后pip自然也被中断了。
但是有些他就是下的慢,比如torch,需要几个小时。

解决:用nohup。但是不能直接nohup pip,因为pip本身是Python的模块。

nohup python -m pip install xxx&

其会挂上一个程序直到跑完,其输出会在nohup.out,可以查看日志。
缺点是,日志只会显示downloading xxx,并不显示进度。你也不知道完没完成,只能通过top命令找进程id查看是否安装完。

猜你喜欢

转载自blog.csdn.net/wtyuong/article/details/130099041
今日推荐