Linux/Linux 后台运行脚本

Linux/Linux 后台运行脚本

我们经常需要在 Linux 服务器上执行一些耗时比较长的操作,比如深度学习的模型训练。但是我们平时在 Linux 上运行的程序可能需要和用户进行交互,例如允许让用户输入,然后输出结果也打印到交互命令行上。这种方式比较适合运行一些简单的命令。但这种模式的缺点是,一旦当前的交互命令行退出,程序就停止运行了。这就要求我们在与服务器断开连接之后,依然能够在 Linux 后台运行脚本。这里先给出一个比较完美的写法。

假设你的脚本是 train.py,你想保存的输出文件为 train.log,那么使用如下语句:

1
nohup python -u train.py > train.log 2>&1 &

nohup命令的意思是 no hang up(不挂起),也就是说,当前交互命令行退出的时候,程序还会执行。

python -u 中的 -u参数是使得python不启用缓冲。默认情况下代码中的输出语句的内容不会立刻被写入 train.log,而是先会存储在缓冲区中,等到一定时机再写入train.log。使用-u参数会关闭缓冲,输出立刻被写入文件。

> train.log 表示把标准输出 (STDOUT) 重定向到train.log中。这样,在代码中使用print打印的字符都会保存在train.log中。

2>&1 中,1表示文件描述符 1,表示标准输出,2表示文件描述符 2,意思是标准错误输出,2>&1表示标准输出和错误输出合并了,将错误输出重定向到标准输出。因为标准错误输出 (STDERR) 没有缓冲区,而标准输出有。这就会导致STDOUT > train.logSTDERR > train.log 分别执行,train.log文件被两次打开写入,而标准输出和错误输出将会竞争覆盖,会出现不可控的问题。

最后的&是指后台运行。但当用户退出的时候,也就是挂起了。脚本也会停止执行。所以使用 nohub就是在当前交互命令行退出的时候,程序还会执行。

参考

linux 下后台运行python脚本

评论