26 bash shell中的信号
当没有任何捕获时,一个交互式 Bash Shell 会忽略 SIGTERM(发送到进程的 TERM 信号用于要求进程终止) 和 SIGQUIT(当用户要求进程执行 core dump 时,QUIT 信号由进程的控制终端发送到进程) 信号。由 Bash 运行的非内部命令会使用 Shell 从其父进程继承的信号处理程序。如果没有启用作业控制,异步执行的命令会忽略除了有这些信号处理程序之外的 SIGINT 和 SIGQUIT 信号。由于命令替换而运行的命令会忽略键盘产生的作业控制信号SIGTTIN(后台进程尝试读取时,TTIN 信号会被发送到进程)、SIGTTOU(后台进程尝试输出时,TTOU 信号会被发送到进程) 和 SIGTSTP(TSTP 信号由进程的控制终端发送到进程来要求它立即终止)。
默认情况下,Shell 接收到 SIGHUP 信号后会退出。在退出之前,一个交互式的 Shell 会向所有的作业,不管是正在运行的还是已停止的,重新发送 SIGHUP 信号。对已停止的作业,Shell 还会发送 SIGCONT信号(继续进程)以确保它能够接收到 SIGHUP 信号。
若要阻止 Shell 向某个特定的作业发送 SIGHUP 信号,可以使用内部命令 disown 将它从作业表中移除,或是用“disown -h”命令阻止 Shell 向特定的作业发送 SIGHUP 信号,但并不会将特定的作业从作业表中移除。
我们通过如下实例,来了解一下 disown 命令的作用:
命令
|
结果
|
---|---|
sleep 30 & #将 sleep 命令放在后台执行,休眠30秒 |
[1] 90021 |
jobs -l #列出当前 Shell 下所有作业的信息 |
[1]+ 90021 Running sleep 30 & |
disown %1 #将作业1从作业表中移除 |
|
jobs -l #再次列出当前 Shell 下所有作业的信息 |
|
ps -ef | grep sleep #查找 sleep 进程 |
|
echo $$ #打印当前 Shell 的进程号 |
67466 |
在上述实例中,我们首先将命令“sleep 30”放在后台运行,此时,我们使用命令“jobs -l”可以看到作业表中有一个正在运行的作业,然后,我们使用命令“disown %1”将作业1从作业表中移除,再使用命令“jobs -l”会看到作业表中已经没有了作业,但是我们发现其实“sleep 30”这个命令的进程仍然存在。此时,Shell 若接收到 SIGHUP 信号,它就不会向作业1重新发送 SIGHUP 信号,此时如果我们退出 Shell,这个作业仍将继续运行,而不会被终止。
我们再来看一下命令“disown -h”的用途:
命令
|
结果
|
---|---|
sleep 30 & #将 sleep 命令放在后台执行,休眠30秒 |
[1] 91133 |
jobs -l #列出当前 Shell 下所有作业的信息 |
[1]+ 91133 Running sleep 30 & |
disown -h %1 #阻止 Shell 向作业1发送 SIGHUP 信号 |
|
jobs -l |
[1]+ 91133 Running sleep 30 & |
我们看到,在执行了命令“disown -h %1”后,作业1并没有从作业表中移除,但它己经被标记,所以即使 Shell 收到 SIGHUP 信号也不会向此作业发送 SIGHUP 信号。因此, 如果此时我们退出 Shell,这个作业也仍将继续运行,而不会被终止。
注意:如果使用内部命令 shopt 打开了 Shell 的 huponexit 选项,当一个交互式的登录 Shell 退出时,会向所有的作业发送 SIGHUP 信号。
最新文章
- JavaWeb学习总结-02 Tomcat 学习和使用
- Ubuntu 设置程序开机启动(以指定用户身份)
- BZOJ4435——[Cerc2015]Juice Junctions
- As3 Anchored Container 代码设置锚点旋转
- vim扩展配置
- 023使用typeof关键字获取类内部结构
- tableView -- tips
- Elasticsarch及插件安装
- codeforces567E. President and Roads
- .net 面试题(3)
- Android android.support.v7.appcompat.R$styleable
- 设计模式之 - 工厂方法模式 (Factory Method design pattern)
- codeforces 665A Buses Between Cities
- java读取.properties配置文件的几种方法
- Android Studio 去除上方标题
- Python 使用 matplotlib绘制3D图形
- mysql -- 逻辑语句
- python学习之基本数据类型
- 修改Linux下的文件以及文件夹的权限
- Hive初步使用、安装MySQL 、Hive配置MetaStore、配置Hive日志《二》