当您关闭正在运行的程序的 bash 终端时,会发送什么信号

当您关闭正在运行的程序的 bash 终端时,会发送什么信号

我有一个启动 Python 程序的 Bash 脚本。 Bash 脚本处理SIGINT,SIGTERMSIGHUP发出信号以执行清理操作。我注意到当我关闭 LXTerminal 选项卡中的进程时,会发生清理过程。但是当我关闭整个终端窗口时,清理过程就会关闭。

为了进行清理过程,我缺少什么?

答案1

这是一个脚本生成一个脚本它将尝试捕获所有信号。它生成的脚本 ( sigcatcher.sh) 在退出之前输出捕获信号的名称。

#!/bin/sh

# generate a shell function for each and every available signal.

/bin/kill -l | tr ' ' '\n' |
while read signal; do
    cat <<END_OF_FUNCTION
handle_$signal () {
  echo "Caught $signal"
  exit
}

trap 'handle_$signal' $signal

END_OF_FUNCTION
done >sigcatcher.sh

echo 'echo "$$"; sleep 600' >>sigcatcher.sh

在我的系统(OpenBSD)上,/bin/kill -l在一行上生成可用信号列表,这就是为什么tr可以将其分解。

生成的脚本将如下所示:

handle_HUP () {
  echo "Caught HUP"
  exit
}

trap 'handle_HUP' HUP

handle_INT () {
  echo "Caught INT"
  exit
}

trap 'handle_INT' INT

(ETC。)

它将完成

echo "$$"; sleep 600

它输出其 PID 并休眠 10 分钟。

你像这样运行它:

$ sh ./sigcatcher.sh >sigcatcher.out

然后你关闭窗口,然后你检查sigcatcher.out

我不运行 X Windows,但是当我终止tmux运行该脚本的窗格时,我在输出文件中收到“Caught HUP”。

相关内容