我有一个启动 Python 程序的 Bash 脚本。 Bash 脚本处理SIGINT
,SIGTERM
并SIGHUP
发出信号以执行清理操作。我注意到当我关闭 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”。