`
leehomjan
  • 浏览: 16631 次
  • 性别: 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
分享到:
评论

相关推荐

    用shell写守护进程

    轻松教你写守护进程, 设想:用一个shell查看一个后台运行的PHP程序是否非正常退出 如果退出,利用守护进程自动restart.

    linux作业:编写shell程序

    应用UNIX的fork()等系统调用,编写一个c程序具有以下功能: a) 实现Shell的基本功能,包括有:打印提示符;接受和分析命令行(滤去无效的空格、tab符号以及换行符等);执行命令(要有出错处理;输入exit或者bye退出...

    shell 编程指南pdf

    3.3.3 杀死后台进程 28 3.4 nohup命令 29 3.4.1 使用nohup命令提交作业 29 3.4.2 一次提交几个作业 29 3.5 小结 30 第4章 文件名置换 31 4.1 使用* 31 4.2 使用? 32 4.3 使用[...]和[!...] 32 4.4 小结 33 第5章 ...

    C语言实现的一个shell程序的基本功能,还包括管道,重定向,后台执行等功能

    5.1(30分)使用任何一种程序设计语言实现一个shell 程序的基本功能。 shell 或者命令行解释器是操作系统中最基本的用户接口。写一个简单的shell 程序——myshell,它具有以下属性: (一) 这个shell 程序必须支持...

    LINUX与UNIX SHELL编程指南(很全)

    3.3.3 杀死后台进程 28 3.4 nohup命令 29 3.4.1 使用nohup命令提交作业 29 3.4.2 一次提交几个作业 29 3.5 小结 30 第4章 文件名置换 31 4.1 使用* 31 4.2 使用? 32 4.3 使用[...]和[!...] 32 4.4 小结 33 第5章 ...

    基于yacc的shell编译器

    (1)本实验的user-sh程序设计不包括对配置文件和命令行参数的支持。User-sh应提供一个命令提示符,如“user-sh>”,表示等待用户的输入,执行命令输出的必要信息,然后再打印下一个命令提示符。当用户没有输入时,...

    YSH_Shell程序

    YSH是一个在linux下的shell程序,可以实现基本的外部命令,重定向、管道以及CTRL+Z中断前后台切换退出等多种命令。

    linux下自己用c语言编写的模拟shell

    1、应用UNIX的fork()等系统调用,编写一个c程序具有以下功能: a) 实现Shell的基本功能,包括有:打印提示符; 接受和分析命令行(滤去无效的空格、tab符号以及换行符等);执行命令(要有出错处理;输入exit...

    shell编程学习笔记

    开头和注释: shell脚本的开头,用来解释shell程序,包括:#!/bin/bash、#!/bin/csh、#!/bin/tcsh、#!/bin/pdksh,一般用#!/bin/bash。。 shell脚本中的注释,以#开头的句子表示注释。 ...

    Linux与unix shell编程指南

    3.3.3 杀死后台进程 28 3.4 nohup命令 29 3.4.1 使用nohup命令提交作业 29 3.4.2 一次提交几个作业 29 3.5 小结 30 第4章 文件名置换 31 4.1 使用* 31 4.2 使用? 32 4.3 使用[...]和[!...] 32 4.4 小结 33 第5章 ...

    5.1: Shell概述 、 编写及执行脚本 、 Shell变量 、 数值运算 、 总结和答疑.docx

    | Ctrl+D | 退出 Shell | | Tab | 自动补齐文件名或命令 | 步骤三:练习命令历史 命令历史是 Shell 的一项重要功能,可以记录用户执行的所有命令,以便快速地调用之前执行的命令。 步骤四:练习命令别名 命令...

    linux大作业报告

    ”字符串,主进程休眠一段时间后,在主进程中结束子进程,随后主进程也退出。 9、编写程序,在程序中使用命令行形式显示程序所在当前文件夹下的内容。 10、编写程序,得到当前进程的标识号,并将它打印输出,随后...

    shell编程和unix命令

    3.3.3 杀死后台进程 28 3.4 nohup命令 29 3.4.1 使用nohup命令提交作业 29 3.4.2 一次提交几个作业 29 3.5 小结 30 第4章 文件名置换 31 4.1 使用* 31 4.2 使用? 32 4.3 使用[...]和[!...] 32 4.4 小结 33 第5章 ...

    绝版经典《Linux与UNIX Shell编程指南》

    3.3.3 杀死后台进程 28 3.4 nohup命令 29 3.4.1 使用nohup命令提交作业 29 3.4.2 一次提交几个作业 29 3.5 小结 30 第4章 文件名置换 31 4.1 使用* 31 4.2 使用? 32 4.3 使用[...]和[!...] 32 4.4 小结 33 第5章 ...

    shell教程-30章,下了之后会让你大吃一惊,相当好

    3.3.3 杀死后台进程 28 3.4 nohup命令 29 3.4.1 使用nohup命令提交作业 29 3.4.2 一次提交几个作业 29 3.5 小结 30 第4章 文件名置换 31 4.1 使用* 31 4.2 使用? 32 4.3 使用[...]和[!...] 32 4.4 小结 33 第5章 ...

    LINUX与UNIX SHELL编程指南 高清PDF

    3.3.3 杀死后台进程 28 3.4 nohup命令 29 3.4.1 使用nohup命令提交作业 29 3.4.2 一次提交几个作业 29 3.5 小结 30 第4章 文件名置换 31 4.1 使用* 31 4.2 使用? 32 4.3 使用[...]和[!...] 32 4.4 小结 33 第5章 ...

    LINUX&UNIX SHELL 003

    在 LINUX 和 UNIX 系统中,shell 是一个非常重要的组件,它可以帮助用户与系统交互,执行命令并管理文件系统。然而,在执行某些命令或作业时,我们可能不希望它们占用屏幕,因为我们可能还有其他更重要的事情要做,...

    Linux与Unix Shell编程指南(PDF格式,共30章)

    3.3.3 杀死后台进程 28 3.4 nohup命令 29 3.4.1 使用nohup命令提交作业 29 3.4.2 一次提交几个作业 29 3.5 小结 30 第4章 文件名置换 31 4.1 使用* 31 4.2 使用? 32 4.3 使用[...]和[!...] 32 4.4 小结 33 第5章 ...

    A-Simple-Shell:Shell接受用户命令,然后在单独的进程中执行每个命令

    除非另有说明,否则父进程将等待子进程退出后再继续。 但是,UNIX Shell通常还允许子进程在后台或同时运行。 为此,我们在命令末尾添加一个&符(&)。 因此,如果我们将上述命令重写为mysh> cat file1,那么父...

Global site tag (gtag.js) - Google Analytics