为脚本设置超时时间

有时候脚本的执行时间可能会很长,甚至是永远等待,比如尝试连接一个没有启动的数据库。在某些没有人工干预的情况下,为脚本设置一个超时值是比较合理的。比较简单的一种做法是这样:

TIMEOUT=600
sleep $TIMEOUT && kill -9 $$ &

#your script here

kill -9 %1 >>/dev/null

其中第二行在后台睡眠,当他醒来之后发现脚本的活还没完成,就把当前脚本kill掉

第六行也是必须的,因为如果脚本先执行完并推出后,第二行可能还在sleep,而操作系统又刚好复用了原来脚本的pid,当sleep醒来之后就会把这个无辜的倒霉蛋kill掉。虽然这种情况不太可能会出现,但是以防万一,还是在退出前先把sleep干掉。

这种做法还是太暴力了一些,实际情况中可能会有一些别的要求,比如我们的双机系统要求脚本stop返回0,如果脚本是被kill -9干掉的,它会返回139。可以用信号来完善一下:

TIMEOUT=600

sigint_handler()
{
	#force stop operation
	exit 0
}

trap sigint_handler SIGINT
sleep $TIMEOUT && kill -INT $$ &

# your script here

kill -9 %1 >>/dev/null
exit

这样,我们可以在sigint_handler中加入强制清理的调用,并且不管在哪一种情况退出,总是能够确保返回0。

剩下的问题: 这样的脚本直接在shell中调用是没问题的,但是如果在daemon中调用,退出前的kill,是否能正确的认出%1是什么呢?还需要测试一下,待续……

updatedupdated2022-02-222022-02-22