在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
相关推荐
5. **使用Supervisor**:Supervisor是一个进程控制系统,适合管理多个后台进程,包括Python应用程序。安装Supervisor后,配置一个配置文件,指定Python程序的路径和启动参数,然后通过Supervisor启动和管理这个进程...
在Linux和Unix操作系统中,`shell`后台执行命令是一个重要的功能,它允许用户在不阻塞终端的情况下运行程序。这通常适用于那些长时间运行或者需要在特定时间执行的任务,以便用户可以继续其他工作。 首先,`cron`是...
但是,当终端关闭时,后台进程也会被终止。 最后,`nohup`命令用于忽略挂断信号,这意味着即使你退出了终端,命令仍然会继续运行。使用`nohup`的语法如下: ```bash nohup your_command & ``` `nohup`会将输出...
- **启动子进程**:通过`command &`的形式启动子进程,该子进程将作为后台进程运行。 - **获取进程ID**:使用`$!`可以获取最近一次通过`&`启动的后台进程的PID。 - **等待进程结束**:`wait PID`命令用于等待指定的...
在IT领域,Linux Shell脚本是一种非常实用的工具,它允许用户通过编写简短的程序来自动化日常的命令行任务。这些脚本基于Bash语言,是Linux和Unix系统中的默认Shell。本篇将深入探讨"shell脚本小程序"相关的知识点,...
这里使用`nohup`和`&`组合的方式确保`startagent.sh`脚本即使在用户退出后也能继续在后台运行。 ### 总结 通过以上知识点的学习,我们可以清晰地了解到如何在Shell脚本中判断一个进程是否存在,并根据进程的状态...
该程序不仅需要实现Shell的基础交互功能,还要支持后台进程管理、多行命令处理以及输入输出重定向和管道功能。 #### 二、核心功能实现 ##### 1. Shell基本功能 - **打印提示符**:每当程序启动或用户执行完一条...
Shell作为Unix系统中的一个重要组成部分,不仅充当命令解释程序的角色,解析并执行用户输入的命令,还能作为一个高级程序设计语言,拥有丰富的语法结构和控制语句。 在Unix系统中,存在多种shell类型,包括Bourne ...
标题 "Linux-pushblast当一个shell程序退出时获取PushBullet通知" 涉及的是一个名为 `pushblast` 的工具,该工具主要用于Linux环境,它能够帮助用户在shell脚本或命令执行完毕,即程序退出时,自动发送PushBullet...
Shell 程序是操作系统中最基本的用户接口,通过编写一个简单的 Shell 程序 myshell,展示了 Shell 编程开发的基本概念和技术。 Shell 的基本概念 Shell 是一个命令行解释器,允许用户通过键入命令来与操作系统...
Bourne shell中有若干保留字符和特殊符号,如`$`用于引用变量、`#`用于注释、`&`用于后台执行进程、`?`和`*`用于通配符匹配、`$-`表示shell选项、`$!`表示最近子进程的PID、`$#`表示传递给脚本的参数数量、`$*`表示...
Shell提供了查看进程状态信息PS、终止后台进程KILL、实现定时任务调度CRON等命令。利用这些命令,可以有效地控制进程的执行和调度,确保系统资源的合理利用。 在文件、目录与磁盘管理方面,Shell同样扮演着重要角色...
4. **后台进程和子进程** 使用`&`符号可以在后台执行命令,如`sleep 10 &`,此时Shell可以继续处理其他任务。`ps`命令用于查看当前运行的进程。 5. **Shell的自动执行** UNIX系统中的cron服务允许在指定时间自动...
C Shell,通常称为csh,是Unix和类Unix操作系统中的一种命令行解释器,它为用户提供了一种交互式界面来执行命令和运行程序。这个教程是针对初学者设计的,旨在帮助他们理解和掌握C Shell的基本操作和特性。 C Shell...
编写这样的Shell程序不仅可以帮助学生深入理解操作系统的工作原理,而且还能提高他们对进程控制、文件系统操作、输入输出管理和信号处理等方面的实践能力。通过这个实验,学生们将有机会亲手实现一个完整的、具有...
这个shell程序不仅具备了基本的命令执行功能,还增加了对管道(pipe)、重定向(redirection)以及后台执行(background execution)的支持,这些都是在Linux环境下进行程序设计时非常重要的特性。 首先,我们来看`...
`fg`和`bg`命令分别用于将后台进程放到前台和将前台进程放到后台,而`jobs`命令用于列出当前会话中的所有作业。 此外,`alias`命令可以创建别名,简化常用命令的输入,`export`用于设置环境变量,使得它们在子shell...
在本文中,我们将深入探讨如何使用Delphi编程语言来实现一个功能强大的进程自动监控和重启系统,同时,这个系统是非控件实现的托盘程序,这意味着它能够在系统托盘区运行,提供低调且高效的后台服务。这个解决方案...
标题中的“unix、Linux命令解释程序 shell”指的是Unix和Linux操作系统中的命令行接口,也就是Shell。Shell是一个用户与操作系统交互的界面,它接收用户输入的命令并执行相应的操作。在这个项目中,你需要实现一个...