`
leehomjan
  • 浏览: 16961 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

shell退出后 后台进程关闭的原因和对处

阅读更多

在linux上进行测试时发现启动后台进程后,如果使用exit退出登录shell,shell退出后后台进程还是能够正常运行,但如果直接关闭登陆的窗口(如直接关掉xshell),那后台进程就会一起终了。都是退出登录为什么前者后台进程会退出,而后者不会退出呢?

在查看bash的manual时发现有如下一段描述:

The shell exits by default upon receipt of a SIGHUP. Before exiting, an interactive shell resends the SIGHUP to all jobs, running or stopped. Stopped jobs are sent SIGCONT to ensure that they receive the SIGHUP.

由此可以知道后台进程退出是由于登陆shell收到了SIGHUP信号后在退出前将SIGHUP转发给所有的作业(jobs)。jobs由于收到SIGHUP而终止运行。

那能不能通过设置,在窗口异常关闭时保持后台进程继续运行呢?

答案是肯定的,一般有如下4种方法:

1. 使用nohup运行命令

# nohup ./back.sh &
# nohup ./fore.sh
^Z
[2]+  Stopped                 nohup ./fore.sh
# jobs 
[1]-  Running                 nohup ./back.sh &
[2]+  Stopped                 nohup ./fore.sh
# ps -o pid,ppid,pgid,sid,cmd
  PID  PPID  PGID   SID CMD
 4766  4716  4766  4716 /bin/bash ./back.sh
 4769  4716  4769  4716 /bin/bash ./fore.sh
# fg
nohup ./fore.sh

### 关闭窗口并重新登录 ###

# ps -eo pid,paid,pgid,sid,cmd |grep -E "back|fore"
 4766     1  4766  4716 /bin/bash ./back.sh
 4769     1  4769  4716 /bin/bash ./fore.sh

发现重新登录后前台和后台进程都还运行着但父进程变成了init。

值得注意的是nohup会在当前目录下产生一个nohup.out文件,并把实际命令的标准输出和标准错误重定向为nohup.out

 

2. 使用setsid运行命令

# setsid ./back.sh &
# setsid ./fore.sh
# jobs 
# ps -eo pid,ppid,pgid,sid,cmd |grep -E "back|fore"
 4871     1  4871  4871 /bin/bash ./back.sh
 4874     1  4874  4874 /bin/bash ./fore.sh

### 关闭窗口并重新登录 ###

# ps -eo pid,ppid,pgid,sid,cmd |grep -E "back|fore"
 4871     1  4871  4871 /bin/bash ./back.sh
 4874     1  4874  4874 /bin/bash ./fore.sh

可以发现在使用setsid后,不能在当前登录shell的jobs中找到back.sh和fore.sh。并且由于在退出前back.sh和fore.sh的父进程已经是init,重新登录后back.sh和fore.sh没有发生任何改变。

 

3. 使用disown命令

# ./fore.sh
^Z
[2]+  Stopped 
# jobs 
[1]-  Running                 ./back.sh &
[2]+  Stopped                 ./fore.sh
# ps -eo pid,ppid,pgid,sid,cmd |grep -E "back|fore"
 5395  5361  5395  5361 /bin/bash ./back.sh
 5396  5361  5396  5361 /bin/bash ./fore.sh
# disown -h %2
# disown -a %1
# jobs 
[2]+  Stopped                 ./fore.sh
# fg
./fore.sh

### 关闭窗口并重新登录 ###

# ps -eo pid,ppid,pgid,sid,cmd |grep -E "back|fore"
 5395  5361  5395  5361 /bin/bash ./back.sh

重新登录后发现fore.sh还是被终止了,并且经过调查发现终了的原因是收到了SIGHUP信号。由此可见disown仅对后台进程起作用。

 

4.  Catch SIGHUP信号

如果是shell脚本,则在脚本中加上下面的一条语句就行了。

# trap "" HUP

如果是C程序,则使用signal函数对SIGHUP进行屏蔽就行了。

signal(SIGHUP, SIG_IGN);

 

X. 当然相反的我们也可以让shell在exit退出时发送SIGHUP给所有的jobs,具体设置如下:

# shopt -s huponexit

 

0
0
分享到:
评论

相关推荐

    Ubuntu下后台持续运行Python程序

    5. **使用Supervisor**:Supervisor是一个进程控制系统,适合管理多个后台进程,包括Python应用程序。安装Supervisor后,配置一个配置文件,指定Python程序的路径和启动参数,然后通过Supervisor启动和管理这个进程...

    shell 后台执行命令

    在Linux和Unix操作系统中,`shell`后台执行命令是一个重要的功能,它允许用户在不阻塞终端的情况下运行程序。这通常适用于那些长时间运行或者需要在特定时间执行的任务,以便用户可以继续其他工作。 首先,`cron`是...

    后台执行shell命令

    但是,当终端关闭时,后台进程也会被终止。 最后,`nohup`命令用于忽略挂断信号,这意味着即使你退出了终端,命令仍然会继续运行。使用`nohup`的语法如下: ```bash nohup your_command & ``` `nohup`会将输出...

    用shell写守护进程

    - **启动子进程**:通过`command &`的形式启动子进程,该子进程将作为后台进程运行。 - **获取进程ID**:使用`$!`可以获取最近一次通过`&`启动的后台进程的PID。 - **等待进程结束**:`wait PID`命令用于等待指定的...

    shell脚本小程序

    在IT领域,Linux Shell脚本是一种非常实用的工具,它允许用户通过编写简短的程序来自动化日常的命令行任务。这些脚本基于Bash语言,是Linux和Unix系统中的默认Shell。本篇将深入探讨"shell脚本小程序"相关的知识点,...

    shell判断一个进程是否存在

    这里使用`nohup`和`&`组合的方式确保`startagent.sh`脚本即使在用户退出后也能继续在后台运行。 ### 总结 通过以上知识点的学习,我们可以清晰地了解到如何在Shell脚本中判断一个进程是否存在,并根据进程的状态...

    linux作业:编写shell程序

    该程序不仅需要实现Shell的基础交互功能,还要支持后台进程管理、多行命令处理以及输入输出重定向和管道功能。 #### 二、核心功能实现 ##### 1. Shell基本功能 - **打印提示符**:每当程序启动或用户执行完一条...

    unix shell程序设计

    Shell作为Unix系统中的一个重要组成部分,不仅充当命令解释程序的角色,解析并执行用户输入的命令,还能作为一个高级程序设计语言,拥有丰富的语法结构和控制语句。 在Unix系统中,存在多种shell类型,包括Bourne ...

    linux-pushblast当一个shell程序退出时获取PushBullet通知

    标题 "Linux-pushblast当一个shell程序退出时获取PushBullet通知" 涉及的是一个名为 `pushblast` 的工具,该工具主要用于Linux环境,它能够帮助用户在shell脚本或命令执行完毕,即程序退出时,自动发送PushBullet...

    shell(C语言开发)

    Shell 程序是操作系统中最基本的用户接口,通过编写一个简单的 Shell 程序 myshell,展示了 Shell 编程开发的基本概念和技术。 Shell 的基本概念 Shell 是一个命令行解释器,允许用户通过键入命令来与操作系统...

    Bourne shell编程入门

    Bourne shell中有若干保留字符和特殊符号,如`$`用于引用变量、`#`用于注释、`&`用于后台执行进程、`?`和`*`用于通配符匹配、`$-`表示shell选项、`$!`表示最近子进程的PID、`$#`表示传递给脚本的参数数量、`$*`表示...

    SHELL基础学习指导

    Shell提供了查看进程状态信息PS、终止后台进程KILL、实现定时任务调度CRON等命令。利用这些命令,可以有效地控制进程的执行和调度,确保系统资源的合理利用。 在文件、目录与磁盘管理方面,Shell同样扮演着重要角色...

    shell程序编写.doc

    4. **后台进程和子进程** 使用`&`符号可以在后台执行命令,如`sleep 10 &`,此时Shell可以继续处理其他任务。`ps`命令用于查看当前运行的进程。 5. **Shell的自动执行** UNIX系统中的cron服务允许在指定时间自动...

    The C Shell tutorial

    C Shell,通常称为csh,是Unix和类Unix操作系统中的一种命令行解释器,它为用户提供了一种交互式界面来执行命令和运行程序。这个教程是针对初学者设计的,旨在帮助他们理解和掌握C Shell的基本操作和特性。 C Shell...

    操作系统实验报告 shell程序

    编写这样的Shell程序不仅可以帮助学生深入理解操作系统的工作原理,而且还能提高他们对进程控制、文件系统操作、输入输出管理和信号处理等方面的实践能力。通过这个实验,学生们将有机会亲手实现一个完整的、具有...

    C语言实现的一个shell程序源码以及PDF版报告

    这个shell程序不仅具备了基本的命令执行功能,还增加了对管道(pipe)、重定向(redirection)以及后台执行(background execution)的支持,这些都是在Linux环境下进行程序设计时非常重要的特性。 首先,我们来看`...

    linuxshell专题讲座.docx

    `fg`和`bg`命令分别用于将后台进程放到前台和将前台进程放到后台,而`jobs`命令用于列出当前会话中的所有作业。 此外,`alias`命令可以创建别名,简化常用命令的输入,`export`用于设置环境变量,使得它们在子shell...

    delphi 实现进程自动监控、重启,非控件实现托盘程序

    在本文中,我们将深入探讨如何使用Delphi编程语言来实现一个功能强大的进程自动监控和重启系统,同时,这个系统是非控件实现的托盘程序,这意味着它能够在系统托盘区运行,提供低调且高效的后台服务。这个解决方案...

    unix、Linux命令解释程序 shell

    标题中的“unix、Linux命令解释程序 shell”指的是Unix和Linux操作系统中的命令行接口,也就是Shell。Shell是一个用户与操作系统交互的界面,它接收用户输入的命令并执行相应的操作。在这个项目中,你需要实现一个...

Global site tag (gtag.js) - Google Analytics