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

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

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

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

#!/bin/bash

# ...

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

# ...

exit 0

我不会在后台运行脚本本身。简单地./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 &

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

答案1

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

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

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

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

相关内容