在MATPool矩池云将程序挂后台运行

本教程将会教大家如何最快速的解决:如何将自己的python程序挂后台运行?即使关闭电脑/断网了程序依然能在服务器中运行?等问题。

1、上传代码,租用机器

首先你需根据入门教程:上传数据集&代码到矩池云网盘中的方法将自己的代码和数据上传到矩池云网盘。

代码和数据上传完成后,可以继续跟着入门教程:租用一台合适的主机步骤租用一台机器,机器租用、启动成功后,点击租用界面中的Jupyterlab链接。(当然你也可以通过其他ssh方式连接使用服务器)

rental-interface

2、使用nohup将程序挂到后台运行

2.1 新建Terminal窗口

在jupyterlab页面点击左上角+号,然后点击页面中的Terminal,新建一个Terminal窗口。

new-terminal

如果你使用的Pycharm远程连接服务器,可以在Pycharm中点击tools->start ssh session,连接后输入后面的指令。

如果你是使用的VSCode远程连接服务器,可以在VSCode中点击终端-> New Terminal,连接后输入后面的指令。

如果你是使用其他工具ssh方式连接服务器,一样的进入Terminal即可开始后面操作。

2.2 cd指令进入项目目录

输入cd指令进入到项目目录,以为自己为例:代码上传在网盘(网盘对应/mnt目录)中的temp文件夹中,所以执行cd /mnt/temp可以进入到项目代码文件目录。(ls指令查看当前目录下有哪些文件和文件夹,123.py是我运行的程序文件)

(myconda) root@3899fb6a82d4:/# cd /mnt/temp/
(myconda) root@3899fb6a82d4:/mnt/temp# ls
123.py  t

2.3 输入nohup指令,将程序挂后台运行

# 万能模板
nohup python -u xxx.py > /root/run.log 2>&1 &
  • xxx.py 是你要挂后台运行的代码文件
  • /root/run.log 是代码运行输出(print打印输出)内容存放路径,可以自己修改成指定路径

注意:如果是多个程序挂后台运行,每个程序的输出内容存放文件需要改成不同的名称,不然会互相覆盖。

比如我现在同时挂后台运行123.py和124.py,那么给的日志存放路径应该是不一样的,比如:/root/123.log和/root/124.log。

接2.2中的,以我自己为例,我需要将123.py挂后台运行,那么进入代码目录后,执行下面指令即可。

(myconda) root@3899fb6a82d4:/mnt/temp# nohup python -u 123.py > /root/run.log 2>&1 &
[1] 115

执行成功后会输出一行内容,[1] 115其中115表示后台运行程序的进程id,后面我们可以根据进程id来暂停、恢复、终止程序。

3、后台进程管理

3.1 查看正在运行的程序进程id

在Terminal界面输入ps aux即可查看系统中的进程和相关信息,我们常用的进程属性有:PID、STAT、COMMAND。

  • PID 进程id,可以根据进程id来暂停、恢复、终止程序
  • STAT 进程状态,R运行、T停止、S休眠
  • COMMAND 进程对应的运行指令
(myconda) root@3899fb6a82d4:/mnt/temp# ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0  20256  3592 ?        Ss   00:29   0:00 /bin/bash /root/start_jupyter_service.sh
root        33  0.0  0.0  72296  5656 ?        S    00:29   0:00 /usr/sbin/sshd -D
root        34  0.0  0.8 176256 69720 ?        Rl   00:29   0:04 /root/miniconda3/bin/python3.7 /root/miniconda3/bin/jupyter-lab --notebook
root        39  0.0  0.0  20392  3744 pts/0    Ss+  00:31   0:00 /bin/sh -l
root        44  0.0  0.0  20392  3704 pts/1    Ss+  00:31   0:00 /bin/sh -l
root        81  0.0  0.0  20392  3932 pts/2    Ss   00:46   0:00 /bin/sh -l
root       115  0.0  0.1  23348  8776 pts/2    S    01:10   0:00 python -u 123.py
root       116  0.0  0.0  36148  3184 pts/2    R+   01:10   0:00 ps aux

通过进程对应的运行指令COMMAND我们可以很快找出哪个是我们自己的进程,如上面倒数第二行中的python -u 123.py,对应的进程PID为115

如果没有找到相关进程,说明程序可能没有运行成功(比如:代码出错导致程序直接被终止,这种情况我们可以查看下输出日志)。

3.2 查看程序输出日志

根据程序运行的指令,我们知道程序输出内容存放在/root/run.log中,可以jupyterlab进入对应文件目录双击文件查看内容。

run-log

或者直接在Terminal中输入cat /root/run.log来查看run.log内容。

(myconda) root@3899fb6a82d4:/mnt/temp# cat /root/run.log 
nohup: ignoring input
hello 1651802294.3858736
hello2 1651802304.3959954
hello3 1651802314.4061723
hello4 1651802324.4149039
hello5 1651802334.422892
hello6 1651802344.4330597
Traceback (most recent call last):
  File "123.py", line 17, in <module>
    f.write(a)
TypeError: write() argument must be str, not int

从上面日志内容不难发现,程序有一个错误,write()函数的参数需要是str类型,而我们给的是int型,发现程序有问题,我们需要修改程序后重新运行。

建议: 大家应该现在本地或者服务器上将代码调试好后再挂到后台运行,避免跑很久后才发现程序出问题,然后再修改再运行,浪费时间和精力。

3.3 终止正在运行的程序

如果你想终止自己挂后台的程序,可以按以下步骤操作:

  • Terminal中输入 ps aux 查看正在运行的进程信息
  • 通过进程信息中的COMMAND可以找到自己运行的程序,拿到对应的进程PID
  • 然后执行kill指令终止对应进程,格式:kill pid

注意: 终止程序进程时请务必核对好对应程序进程对应的pid,切记不要随意终止服务中其他进程,比如jupyterlab、ssh等,避免导致服务器不可用或者数据丢失等问题。

kill-process

3.4 其他关于进程操作

kill -STOP pid   # 暂停正在运行的进程
kill -CONT pid   # 恢复暂停运行的进程
kill -9 pid      # 强制停止运行中的进程

另外,在VNC、Tmux中运行程序,程序也会持久化运行,可以通过下面教程了解相关使用方法。

VNC Viewer 远程连接矩池云机器教程

Tmux 使用教程

其他阅读推荐:矩池云如何通过代码自动释放机器?

客服