在MATPool矩池云将程序挂后台运行
本教程将会教大家如何最快速的解决:如何将自己的python程序挂后台运行?即使关闭电脑/断网了程序依然能在服务器中运行?等问题。
1、上传代码,租用机器
首先你需根据入门教程:上传数据集&代码到矩池云网盘中的方法将自己的代码和数据上传到矩池云网盘。
代码和数据上传完成后,可以继续跟着入门教程:租用一台合适的主机步骤租用一台机器,机器租用、启动成功后,点击租用界面中的Jupyterlab链接。(当然你也可以通过其他ssh方式连接使用服务器)
2、使用nohup将程序挂到后台运行
2.1 新建Terminal窗口
在jupyterlab页面点击左上角+
号,然后点击页面中的Terminal
,新建一个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进入对应文件目录双击文件查看内容。
或者直接在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等,避免导致服务器不可用或者数据丢失等问题。
3.4 其他关于进程操作
kill -STOP pid # 暂停正在运行的进程
kill -CONT pid # 恢复暂停运行的进程
kill -9 pid # 强制停止运行中的进程
另外,在VNC、Tmux中运行程序,程序也会持久化运行,可以通过下面教程了解相关使用方法。
其他阅读推荐:矩池云如何通过代码自动释放机器?