进程与终端--终端关闭后,后台进程也终止

问题:

ssh登录服务器,并开启一个后台进程,然后自己去做其他事情了。等过了一会儿,当再来查看时,发现开启的后台进程莫名其妙的挂掉了。

原因:

无论进程是在后台还是在前台,它都与启动它的终端实例紧密绑定。当终端关闭时,它通常向绑定到终端的所有进程(前台、后台进程)发送SIGHUP信号。 这表示进程终止,因为它们的控制终端将很快不可用。
本例中,ssh登录终端,超过一定时间没有操作后,连接断开,终端关闭,与终端相关的所有进程(包括前台和后台进程)都将终止。

验证:

开启一个后台进程

代码如下:

terminal_process.c
#include <unistd.h>

int main()
{
        while(1)
        {
                sleep(10);
        }

        return 0;
}

编译、后台运行

$ gcc terminal_process.c -o terminal_process
$ ./terminal_process &

查看前后台进程、终端

$ ps -o pid,ppid,pgrp,session,tpgid,comm,tty
   PID   PPID   PGRP   SESS  TPGID COMMAND              TT
 15907  15906  15907  15907  16145 bash                 pts/1
 15946  15907  15946  15907  16145 terminal_proces      pts/1
 16145  15907  16145  15907  16145 ps                   pts/1

其中,

  • pgrp 进程组ID
  • tpgid 控制进程组ID
  • tty 控制终端号
  • 15097是会话首进程,会话ID为其ID,此时会话首进程属于后台进程组。
  • terminal_proces进程是15946,其父进程为bash(会话首进程15907)。
  • 16145拥有控制终端,所以是前台进程组。
  • 15907、15946都是后台进程组。

过一段时间,没有操作终端,ssh登录终端自动断开。
再查看进程,可以看到刚才开启的进程已经终止。

另外,本地终端强制关闭,也有类似的问题。

解决办法:

终端开启一个后台进程后,例如termal_process,然后终端下输入命令exit正常退出.

$ ./terminal_process &
$ ps -ef | grep terminal_process
lanyang   16946  16907  0 10:18 pts/1    00:00:00 ./terminal_process

$ exit

登录另一个终端查看

$ ps -ef | grep terminal_process
lanyang   16946      1  0 10:18 ?        00:00:00 ./terminal_process

terminal_process的父进程已经变成了init进程,不会出现刚才的问题。

除了这个方法,还有nohup,disown等其他,有兴趣可以自行搜索查看。

参考:

Linux终端关闭后台进程也结束原因分析和nohup的使用

让Linux的进程不受终端影响

Linux 技巧:让进程在后台可靠运行的几种方法

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 您可以使用nohup命令将while脚本放入后台运行,即使退出终端也不会终止,命令格式如下: nohup sh your_script.sh & 其中your_script.sh是您的while脚本文件名。运行后,您可以关闭终端,脚本仍然在后台运行。您可以使用ps命令查看该脚本的进程ID,并使用kill命令停止它的运行。 ### 回答2: 要让一个while循环脚本在退出终端后继续执行,我们可以使用一些技巧和命令。以下是一种可能的方法: 1. 在终端中运行脚本时,使用nohup命令。例如:nohup python script.py &。nohup命令可以将脚本放在后台运行,并忽略挂起信号(SIGHUP),这意味着即使退出终端,脚本也会继续在后台运行。 2. 可以把while循环的代码封装在一个bash脚本中,然后在终端中运行这个bash脚本。这样,即使退出终端,脚本也会继续运行。 3. 可以使用screen或tmux这样的终端复用工具。这些工具可以在后台创建一个虚拟终端窗口,你可以在其中运行脚本。即使你退出了主终端窗口,脚本仍然会继续在虚拟终端窗口中运行。 无论使用哪种方法,要注意以下几点: - 尽量将输出重定向到一个文件中,防止脚本的输出在后台运行时在控制台中显示。 - 如果脚本需要进行输入调整或与用户进行交互,需要特别注意后台运行可能导致的问题。 - 在某些情况下,可能需要检查脚本是否以期望的方式运行,并处理相关的错误或问题。 综上所述,以上是几种让while循环脚本在退出终端后继续执行的方法,可以根据实际需求选择适合的方式。 ### 回答3: 要让while脚本一直在跑,退出终端也不会终止,可以使用以下方法: 1. 使用nohup命令:在终端中输入nohup命令,后面跟上要执行的脚本命令,然后加上&符号,表示在后台运行。例如:nohup python script.py &。这样脚本将在后台一直运行,即使退出终端也不会终止。 2. 使用screen命令:首先安装screen工具(如果尚未安装),然后在终端中输入screen命令,进入一个新的会话界面。在该界面中运行脚本,然后按下Ctrl+A,再按下D键,即可将会话分离。此时即使退出终端,脚本仍然在后台运行。重新登录终端后,可以使用screen -r命令恢复该会话并查看脚本输出。 3. 使用tmux命令:类似于screen,tmux也是一个会话管理工具。首先安装tmux(如果尚未安装),然后在终端中输入tmux命令,进入一个新的会话。在该会话中运行脚本,然后按下Ctrl+B,再按下D键,即可将会话分离。此时即使退出终端,脚本仍然在后台运行。重新登录终端后,使用tmux attach命令恢复会话并查看脚本输出。 通过以上方法,可以让while脚本一直在后台运行,即使退出终端也不会终止。请根据您的实际需求选择适合您的方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值