文章目录

  • ​​后台执行nohup​​
  • ​​1.最简单的nohup方式​​
  • ​​2.指定log输出路径和文件的nohup方式​​
  • ​​3.指定log输出路径和文件并记录程序的PID​​
  • ​​4.运行bash脚本​​
  • ​​nohup日志实时监控并打印输出​​

由于这周在服务器端训练大型的模型,一般都需要几天的时间,结果,这周连续断了两次电,服务器是没断电,但是主机没电关机了,导致意外训练中止。我一个程序跑了3天,还差一天的时候中断了;另一个是跑了一天多,还剩1/3的时候又中断了。。。所以泪目找nohup,防止网络中断导致训练停止。

后台执行nohup

1.最简单的nohup方式

使用​​nohup​​​命令,最后加上​​&​​即可:

# nohup xxxx xxxx &
nohup python train.py &
  • ​Ctrl + C​​不会中断程序的执行;
  • nohup会将所有的输出默认写入在当前路径的​​nohup.out​​文件中。

如下所示:

Linux——nohup后台运行程序并记录PID_实时监控


如果你的程序有后缀参数,可以这样优雅的写:

nohup python train.py --log_iter 1 \ # 所有的参数最后加 \
--vis_log_iter 1 \
--nepochs 10 \
--bsz 10 \
& # 将 & 放在最后即可

2.指定log输出路径和文件的nohup方式

# nohup xxxx xxxx > xxx(ur_log_file) 2>&1 &
nohup python train.py > train.log 2>&1 &
  • nohup会将所有的输出默认写入在你指定的的​​log_file​​​文件中,我这里的就是​​train.log​​。

带参数优雅版:

nohup python train.py --log_iter 1 \ # 所有的参数最后加 \
--vis_log_iter 1 \
--nepochs 10 \
--bsz 10 \
> runs_seg/train.log 2>&1 &

3.指定log输出路径和文件并记录程序的PID

# nohup xxxx xxxx > xxx(ur_log_file) 2>&1 & echo $! > xxx(pid file)
nohup python train.py > train.log 2>&1 & echo $! > run.pid
  • nohup会将所有的输出默认写入在你指定的的​​log_file​​​文件中,我这里的就是​​train.log​​;
  • 同时会将当前python的PID记录在​​run.pid​​中,方便你中止程序(一般训练中都用会使用多进程,所以实际上会有多个程序,但是nohup只会记录当前启动的那个程序的PID,不过不影响,因为你只要杀掉1个子进程,所有进程都会中止)。

Linux——nohup后台运行程序并记录PID_linux_02

4.运行bash脚本

# nohup sh xxxx.sh 可跟参数 > train.log 2>&1 &
nohup sh tools/dist_train_semi.sh configs/semi_bevdet/semi_bevdet_baseline.py 8 > train.log 2>&1 &

nohup日志实时监控并打印输出

实时监控nohup输出log的内容:

tail -f train.log

Linux——nohup后台运行程序并记录PID_路径和_03

参考文章:

  • ​​linux 使用nohup的时候输出日志的同时也输出该程序的pid​​
  • ​​Linux后台运行命令nohup实现屏幕输出记录到日志文件​​