Linux命令–会话断开后不停止程序–方法/实例

艺帆风顺 发布于 2025-04-03 31 次阅读


简介

说明

        本文介绍Linux会话断开后不停止程序的方法。

概述

        当用户注销(logout)或者网络断开时,终端会收到 HUP(hangup)信号从而关闭其所有子进程。因此,我们的解决办法就有两种途径:要么让进程忽略 HUP 信号,要么让进程运行在新的会话里从而成为不属于此终端的子进程。

方法1:nohup

说明

用ssh时,只能等命令运行完再关闭ssh对话,若关闭了会话,则命令会停止执行。

nohup:在退出ssh对话后仍然运行该命令。(使进程忽略hangup信号,从而持续执行。)

示例

用法:nohup xxx     //xxx表示要运行的命令

方法2:setsid

说明

        setsid作用:使此进程不属于接收HUP 信号的终端的子进程,也就不会受到 HUP 信号的影响了。

        setsid中的sid指的是session id,意指以该命令运行的进程是一个新的session,因此其父进程id不属于当前终端。实际上,setsid运行的进程,其父进程id(PPID)为1(init 进程的 PID)。

示例

  1. [root@lwy ~]# sleep 100 &

  2. [2] 10661

  3. [root@lwy ~]# ps -ef|grep sleep

  4. root     10661  9835  0 16:20 pts/1    00:00:00 sleep 100

  5. root     10663  9835  0 16:20 pts/1    00:00:00 grep sleep

  6. [root@lwy ~]# setsid sleep 100

  7. [root@lwy ~]# ps -ef|grep sleep

  8. root     10661  9835  0 16:20 pts/1    00:00:00 sleep 100

  9. root     10666     1  0 16:20 ?        00:00:00 sleep 100

  10. root     10668  9835  0 16:20 pts/1    00:00:00 grep sleep

法3:()与&

说明

        将一个或多个命名包含在“()”中就能让这些命令在子 shell 中运行中,从而扩展出很多功能。

        将"&"也放入“()”内之后,会发现所提交的作业并不在作业列表中,即:无法通过jobs来查看,躲过 HUP 信号的影响。

示例

  1. [root@lwy ~]# (sleep 100 &)

  2. [root@lwy ~]# ps -ef|grep sleep

  3. root     10588     1  0 15:57 pts/1    00:00:00 sleep 100

  4. root     10590  9835  0 15:57 pts/1    00:00:00 grep sleep

  5. [root@lwy ~]# ps -p 9835   ##可以看出sleep 100 的父进程是当前shell终端

  6. PID TTY          TIME CMD

  7. 9835 pts/1    00:00:00 bash

        可以看出,新提交的进程的父 ID(PPID)为1(init 进程的 PID),并不是当前终端的进程 ID。因此并不属于当前终端的子进程,从而也就不会受到当前终端的 HUP 信号的影响了。 

法4:disown

说明

        如果我们未加任何处理就已经提交了命令,这时想加 nohup 或者 setsid 已经为时已晚,只能通过作业调度和 disown 来解决这个问题了。

我们可以用如下方式来达成我们的目的。

  • disown -h jobspec 来使某个作业忽略HUP信号。

  • disown -ah 来使所有的作业都忽略HUP信号。

  • disown -rh 来使正在运行的作业忽略HUP信号。

        使用过 disown 之后,会将把目标作业从作业列表中移除,我们将不能再使用jobs来查看它,但是依然能够用ps -ef查找到它。
        这种方法的操作对象是作业,若在运行命令时在结尾加了"&"来使它成为一个作业并在后台运行,那么可以通过jobs命令来得到所有作业的列表。
        如果并没有把当前命令作为作业来运行,如何得到它的作业号呢?答案就是用 CTRL-z(按住Ctrl键的同时按住z键)了!CTRL-z 的用途就是将当前进程挂起(Suspend),然后我们就可以用jobs命令来查询它的作业号,再用bg jobspec 来将它放入后台并继续运行。需要注意的是,如果挂起会影响当前进程的运行结果,慎用此方法。

示例

  1. [root@lwy ~]# sleep 100 &

  2. [1] 10895

  3. [root@lwy ~]# jobs

  4. [1]+  Running                 sleep 100 &

  5. [root@lwy ~]# disown -h %1

  6. [root@lwy ~]# ps -ef|grep sleep

  7. root     10895  9835  0 17:04 pts/1    00:00:00 sleep 100

  8. root     10898  9835  0 17:04 pts/1    00:00:00 grep sleep

    版权声明:本文内容始发于CSDN>作者:Linux命令--会话断开后不停止程序--方法/实例,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。始发链接:hhttps://blog.csdn.net/feiying0canglang/article/details/125803653在此特别鸣谢原作者的创作。此篇文章的所有版权归原作者所有,商业转载建议请联系原作者,非商业转载请注明出处。