信号(三):Bash 中的信号

当没有任何捕获时,一个交互式 Bash Shell 会忽略 SIGTERM 和 SIGQUIT 信号。由 Bash 运行的非内部命令会使用 Shell 从其父进程继承的信号处理程序。如果没有启用作业控制,异步执行的命令会忽略除了有这些信号处理程序之外的 SIGINT 和 SIGQUIT 信号。由于命令替换而运行的命令会忽略键盘产生的作业控制信号 SIGTTIN、SIGTTOU 和 SIGTSTP。

默认情况下,Shell 接收到 SIGHUP 信号后会退出。在退出之前,一个交互式的 Shell 会向所有的作业,不管是正在运行的还是已停止的,重新发送 SIGHUP 信号。对已停止的作业,Shell 还会发送 SIGCONT 信号以确保它能够接收到 SIGHUP 信号。若要阻止 Shell 向某个特定的作业发送 SIGHUP 信号,可以使用内部 disown 将它从作业表中移除,或是用 “disown -h” 命令阻止 Shell 向特定的作业发送 SIGHUP 信号,但并不会将特定的作业从作业表中移除。我们通过如下实例,来了解一下 disown 命令的作用:

# 将 sleep 命令放在后台执行,休眠 30 秒
sleep 30 &

# 列出当前 Shell 下所有作业的信息
jobs -l

# 将作业 1 从作业表中移除
disown %1

# 再次列出当前 Shell 下所有作业的信息
jobs -l

# 查找 sleep 进程
ps -ef | grep sleep

# 打印当前 Shell 的进程号
echo $$

运行结果:

信号(三):Bash 中的信号_第1张图片
运行结果

在上述实例中,虽然作业表中已经没有了作业,但是进程依然存在。此时,Shell 若收到 SIGHUP 信号,它就不会向作业 1 重写发送 SIGHUP 信号,此时如果我们退出 Shell,这个作业仍将继续运行,而不会被终止。

本文参考自 《Linux Shell命令行及脚本编程实例详解 》

你可能感兴趣的:(信号(三):Bash 中的信号)