Linux后台执行命令行程序避免远程连接中断导致训练意外终止
目标
训练模型的时候XShell老是连接意外中断,导致训练过程终止,不能实现自动化无人值守的训练,因此希望连接中断甚至本地客户端关机也能维持训练进程。
解决
Linux下通过nohup命令实现后台执行程序,任何向终端输出文本信息的语句都会被重定向到一个log文件中,如下:
conda activate pytorch-gpu
cd ~/xc/Gits/StereoSiamNet/
nohup python train/train_ssn.py > train.log 2>&1 &
参考自overflow问答:https://askubuntu.com/questions/349262/run-a-nohup-command-over-ssh-then-disconnect
或者参考Linux菜鸟教程:https://www.runoob.com/linux/linux-comm-nohup.html
其中nohup
命令是核心,它能实现退出终端依然保持程序在后台运行,和Windows下的start /b
指令是类似的,只不过后者在关闭终端后就退出了,这是由于在终端中执行的命令是附在终端进程上的。
后面的2>&1 &
命令是为了将运行出错的信息(2表示错误输出流stderr)重定向到标准输出stdout中,这样用于我们就可以在自己指定的文件中看到错误输出了。
这里可以学习到以下几点:
- xxx > out_file 只能记录标准输出流stdout的信息;
- &1 表示标准输出stdout, &2表示错误输出流stderr;
- 文件捕获stderr的一种方法就是输出流重定向;
最后的&
符号似乎和nohup
的功能重叠。