1.9 将任务挂在后台
1. 为什么需要将任务挂在后台
我们是通过 ssh 连接服务器,如果我们关闭 ssh 连接,那么我们的任务将会中断,也许有些时间你想让服务器一直运行你的任务,即使你断开连接。
所以最少要知道三种思路:
nohup ... &screentmux
2. nohup 和 &
这是最简单的一种用法。
bash
nohup python train.py > run.log 2>&1 & # 把任务挂到后台并写日志可以先这样理解:
nohup:退出终端后程序尽量继续运行> run.log:把标准输出写到日志2>&1:把报错也写进同一个日志&:让命令在后台运行
启动之后常见检查方式:
bash
tail -f run.log # 实时看日志
ps -ef | grep train.py # 查进程是否还在另外,这里的 2>&1 值得单独解释一下,因为你以后会经常见到。
在 shell 里,可以先这样理解:
1:标准输出stdout2:标准错误stderr
很多程序运行时,正常打印的内容会走标准输出,报错信息会走标准错误。
所以:
bash
python train.py > run.log这条命令只会把正常输出写进 run.log,但报错信息仍然会直接出现在终端里。
简单点, 2>&1 的目的就是让报错也跟着正常输出走,最后写到同一个地方。
3. screen
bash
screen -S work # 创建一个名为 work 的 screen 会话
python train.py # 在会话里运行任务暂时离开会话:
text
Ctrl-a d重新接回去:
bash
screen -ls # 查看当前已有的 screen 会话
screen -r work # 重新连接名为 work 的会话4. tmux
bash
tmux new -s work # 创建一个名为 work 的 tmux 会话
python train.py # 在 tmux 会话里运行任务暂时离开会话:
text
Ctrl-b d重新接回去:
bash
tmux ls # 查看当前已有的 tmux 会话
tmux attach -t work # 重新连接名为 work 的会话tmux 是很强大的命令,请你去问 LLM 吧,这里我就不展开了。
5. 队列系统才是正式计算的主线
很多科学计算任务,不应该长期挂在登录节点里跑,而是应该通过集群队列系统提交任务。常见的有:
LSFSlurm(常见命令是sbatch)PBS
我将在另一节单独讲解。