Linux nohup命令详解

Linux nohup命令详解

我们自己笔记本或台式机的显卡往往不能支持我们进行深度学习实验或大模型训练,因此我们往往使用SSH连接服务器然后去运行代码。

有的时候我们跑的程序需要跑几个小时甚至几天,这样我们就需要一直开着电脑挂着SSH;偶尔也会遇上网络断开,程序半途中止的情况。

所以,我们需要一个下述的功能:即使我们远程连接SSH的终端被关闭了,程序依旧在服务器上运行。这时候就需要用到Linux的nohup指令。

nohup命令是英语词组 no hangup的缩写,意思是不挂断,也就是指程序不退出。这个命令会使程序忽略 HUP 信号,保证程序能够正常进行。HUP 信号是在终端被中止的时候向它所关联的进程所发出的信号,进程收到这个信号后就会中止运行。所以如果你不希望进程被这个信号干掉的话,就可以忽略这个信号。而 nohup命令做的就是这个事情。


首先来看nohup的语法:

nohup Command [Arg...] [ &]

最后的" &":表示后台运行,不占用交互命令行

如果不将 nohup 命令的输出重定向,输出将附加到当前目录的 nohup.out 文件中。

如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中。

如果没有文件能创建或打开以用于追加,那么 Command 参数指定的命令不可调用。

如果标准错误是一个终端,那么把指定的命令写给标准错误的所有输出作为标准输出重定向到相同的文件描述符。

假设用nohup运行一个名为task.sh的脚本: nohup task.sh > my_log.out 2>&1 &

该命令中的数字解释如下:

  • 0 – stdin (standard input,标准输入)
  • 1 – stdout (standard output,标准输出)
  • 2 – stderr (standard error,标准错误输出)

2>&1解释: 将标准错误(2)重定向到标准输出(&1), 标准输出(&1)再被重定向输入到my_log.out文件中。


使用举例:

nohup python train.py &

后台运行train.py,会在train.py目录下创建一个nohup.out文件来记录程序的输出。

在使用时,我们会发现一个问题,nohup.out文件中的内容并不会立刻变化,这是因为python的标准输出是有缓冲的。

如果我们想要立刻在nohup.out中实时看到python程序的输出,可以使用以下命令:

nohup python -u train.py &

-u会禁用python的缓冲。

假如我们的训练脚本名为train.sh,我们可以使用以下命令启动训练:

nohup train.sh > log.out 2>&1 &

该命令会在后台运行train.sh,同时将标准错误重定向到标准输出,然后再将标准输出写入到log.out文件中。


上面有提到,nohup 命令结合 & 符号可以使进程在后台运行,即使关闭了终端依然不受影响。这时,如果想要终止这个进程,可以按照以下步骤操作:

ps aux | grep train.sh
或
ps -ef | grep python

通过上面的命令获取进程的pid。

然后用以下命令杀死对应的进程:

kill -9 pid
posted @ 2024-03-12 09:06  一蓑烟雨度平生  阅读(1655)  评论(0编辑  收藏  举报