关闭终端后脚本的后台进程仍然存在

Ran*_*ein 6 bash terminal signals process-management disown

这更像是一个进程管理/信号处理问题,而不是一个 Bash 问题。它只是使用 Bash 来解释这个问题。

我正在运行一个 Bash 脚本,在其中运行一个后台进程。这是脚本:

#!/bin/bash

# ...

# The background process
{ 
  while :; do
    sleep 1 && echo foo >> /path/to/some/file.txt
  done
} &

# ...

exit 0
Run Code Online (Sandbox Code Playgroud)

我不在后台运行脚本本身。简直了./script

“huponexit”shell 选项是使用 启用的shopt -s huponexit,因此当终端关闭时,我希望它向 Bash 发送一个 HUP 信号,它将传播它直到它到达后台进程。如果后台进程不会trap并忽略该信号,它也会被杀死 - 但这不会发生。后台进程的行为就像它被disown'ed 一样。

这是我画的一个方案来说明这个问题。该方案以及上面的描述可能是错误的,因为我确定我对这个主题的理解不够好。如果确实如此,请修复我。

在此处输入图片说明

我想知道为什么关闭终端后后台进程没有被杀死,就好像它是由这样的交互式 shell 调用的:

rany@~/Desktop$ while :; do sleep 1 && echo foo >> /path/to/some/file.txt; done &
Run Code Online (Sandbox Code Playgroud)

我不确定,但我想我的问题的答案在于 Bash fork() 一个非交互式 shell 来运行脚本,该脚本可能具有一组不同的作业控制和信号处理规则。

Hau*_*ing 3

那么手册页告诉我们什么huponexit

如果已使用 shopt 设置了 huponexit shell 选项,则当交互式登录shell 退出时,bash 会向所有作业发送 SIGHUP 。

编辑:强调它是一个登录外壳。

编辑2:交互性值得同等重视