1.前言

  • 在使用 ssh 连接远程服务器时,我们能够以远程管理服务器的方式,在远程终端执行后台命令。但是,如果在命令没有执行完毕就退出登录,这个命令的执行就会中断。
  • 有些时候,我们想要退出登录,但保持程序的运行。比如使用远程服务器训练深度学习模型时,我们不想一直保持与服务器的连接
  • 我们使用 nohup 命令就可以解决这一问题

2.nohup

2.1.基本用法

[root@localhost ~]# nohup [命令] &
  • nohup 是 no hangup 的缩写,意思是不挂断,也就是指程序不退出。这个命令会使程序忽略 SIGHUP 信号,保证程序能够正常进行。SIGHUP 信号是在终端被终止的时候向它所关联的进程所发出的信号,进程收到这个信号后就会中止运行。所以如果你不希望进程被这个信号干掉的话,就可以忽略这个信号。而 nohup 命令做的就是这个事情,让进程不受 shell 关闭的影响。
    • 同时,nohup 执行后,会产生文件nohup.out,将程序执行产生的 stdout/stderr 重定向到这个文件中。一般在当前目录下,如果当前目录不可写,那么自动保存到执行这个命令的用户的 home 目录下,例如 root 的话就保存在 /root/ 下。
  • & 是将命令放到后台运行。将程序放在后台意味着,我们不再与其进行交互。这个命令会使程序忽略 SIGINT 信号,我们用 ctrl C,也不会影响到程序的运行。
    • & 也不会重定向 stdout/stderr,因此如果程序有任何的输出或产生错误,将直接在终端显示。
  • [命令]就是我们正常执行程序所输入的命令,比如:python train.py

2.2.例子

nohup python train.py &
  • 执行 train.py 程序,放到后台执行,并忽略 shell 关闭给的 SIGUP 指令
  • python train.py 就是 [命令]

2.3.重定向输出

2.3.1.命令:command > /dev/null 2>&1 &

  • > 是输出符号,代表重定向到哪里
  • 1stdout标准输出,系统默认值是1。所以> hello.txt 等同于 1 > hello.txt
  • 2stderr标准错误
  • &是等同于的意思,2>&1,表示,stderr的输出重定向到和stdout同样的位置

2.3.2.程序 test.py

print('hello world')
p  # 故意写错

2.3.3.执行命令

  • python test.py > hello.txt 2>&1

    • hello.txt中的内容

      • 可以看到,输出和错误都重定位到了hello.txt
      hello world
      Traceback (most recent call last):
        File "/home/nsy/detection/yolov5-master/nsy_demo.py", line 2, in <module>
          p
      NameError: name 'p' is not defined
      
  • python test.py > hello.txt

    • hello.txt中的内容

      • 可以看到,只有输出重定位到了hello.txt
      hello world
      
      • 错误信息在终端输出(默认),而没有被重定位
  • 我们可以将重定位命令和挂起命令一起使用

    nohup python test.py > hello.txt 2>&1 &

2.4.终止进程

nohup 命令结合 & 符号可以使进程在后台运行,即使关闭了终端依然不受影响。这时,如果想要终止这个进程,要怎么操作呢?

  • 最简单的就是使用 kill 命令

    kill 进程号

  • 如何找到进程对应的 pid 呢?-> 使用 ps 命令

    ps aux | grep 程序名 。比如 ps aux | grep train.py

    • 找到进程号之后,使用 kill PID 就行了
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐