有时候脚本的执行时间可能会很长,甚至是永远等待,比如尝试连接一个没有启动的数据库。在某些没有人工干预的情况下,为脚本设置一个超时值是比较合理的。比较简单的一种做法是这样:
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是什么呢?还需要测试一下,待续……