使用 nohup 命令将程序挂载在后台执行

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 就行了
  • 5
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
使用nohup命令可以在后台持续运行一个命令或脚本,即使关闭终端也不会停止该进程。以下是利用nohup命令进行后台挂载的步骤: 1. 打开终端并登录到你的服务器或系统。 2. 输入以下命令格式来使用nohup命令挂载进程:nohup command > output.log & 这里,command是你要在后台运行的命令,output.log是命令的输出日志文件名。 注意:命令格式中的&符号是必要的,它将命令放入后台执行。 3. 按下Enter键执行命令。 4. 在该终端中,你将看到一条消息,如:nohup: ignoring input and appending output to 'output.log'。 这意味着你的命令已经在后台成功挂载。 5. 关闭该终端,或者在后台运行命令使用Ctrl + Z退出该命令的终端。 注意:不要使用Ctrl + C,因为这个组合键可能会停止正在运行的程序。 6. 如果你想检查命令的输出,可以使用命令:tail -f output.log 这将实时显示output.log文件的内容,以查看命令的输出。 7. 如果你想停止后台挂载命令,可以使用命令:kill [PID] 这里,[PID]是要停止的进程的ID。你可以使用命令:ps -ef | grep [command] 来查找进程的PID(command是你要停止的命令的关键词)。 更简单的方法是使用命令:pgrep [command] 来查找进程的PID。 8. 输入kill命令后,你将看到一个消息,如:[PID]+ Terminated nohup command > output.log 这意味着所选进程已被成功终止。 通过以上步骤,你可以利用nohup命令后台挂载一个命令,让它持续运行而不受终端关闭的影响。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

长命百岁️

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值