使用陷阱终止bash中的函数
Posted
技术标签:
【中文标题】使用陷阱终止bash中的函数【英文标题】:Using trap to terminate a function in bash 【发布时间】:2017-12-12 12:00:43 【问题描述】:我在 bash 中有一个函数,称之为“计时器”,它只显示经过的秒数。目前,它在一个单独的进程中运行,完成后父进程将其杀死。
我希望函数能够以某种方式捕获信号并优雅地退出,但我不知道如何。这是现在的示例脚本:
#!/bin/bash
function timer ()
t0=$(date +%s)
while true ; do
t=$(date +%s)
echo -en "\r$(($t - $t0))"
done
timer &
pid=$!
echo $pid
sleep 5 # do something while timer runs
echo "done"
kill -9 $pid
【问题讨论】:
【参考方案1】:两件事:
不要使用kill -9
杀死它。 SIGKILL
是无法捕获的。它不会让目标进程进行任何清理。只需简单的kill
发送SIGTERM
信号。
您可以使用SIGTERM
进行陷阱。你也可以使用SIGINT
来捕捉Ctrl-C。或者最好,无论脚本如何被杀死,都诱捕EXIT
进行清理。
function timer ()
trap 'echo -e "\ntimer stopped"' EXIT
t0=$(date +%s)
while true ; do
t=$(date +%s)
echo -en "\r$(($t - $t0))"
done
timer &
pid=$!
echo "$pid"
sleep 5 # do something while timer runs
echo "done"
kill "$pid"
【讨论】:
以上是关于使用陷阱终止bash中的函数的主要内容,如果未能解决你的问题,请参考以下文章
在程序以状态退出后执行 EXIT 陷阱时的 Bash 函数范围状态!= 0(设置 -e)