王美洁

1.9 将任务挂在后台

1. 为什么需要将任务挂在后台

我们是通过 ssh 连接服务器,如果我们关闭 ssh 连接,那么我们的任务将会中断,也许有些时间你想让服务器一直运行你的任务,即使你断开连接。

所以最少要知道三种思路:

  • nohup ... &
  • screen
  • tmux

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:标准输出 stdout
  • 2:标准错误 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. 队列系统才是正式计算的主线

很多科学计算任务,不应该长期挂在登录节点里跑,而是应该通过集群队列系统提交任务。常见的有:

  • LSF
  • Slurm(常见命令是 sbatch
  • PBS

我将在另一节单独讲解。