当前位置: 首页 > 科技观察

LinuxShell脚本执行超时怎么办?

时间:2023-03-11 23:29:55 科技观察

shell中有一个不常见的情况,就是脚本有时会超时。一般来说,当我们遇到这种问题时,我们会简单粗暴地使用下面的脚本作为“超时看门狗”:如果这个脚本是和两个变量一起使用,监控一点代码就可以了,但是它的逻辑还是比较粗糙。比如脚本执行的时候后台启动了一个新的进程,这个新进程就会被kill掉,而本该停止的脚本还在后台肆无忌惮的运行着。为了不滥杀无辜,遇到这种情况,一定要使用timeout命令。具体用法请自行#mantimeout。这个命令是centos6自带的,假设我们要pingwww.baidu.com,同时请求“如果超过5秒没有响应,停止这个任务”。然后使用命令:#timeout5spingwww.baidu.com,效果如图:从26秒到31秒,确实达到了5秒跳出的效果。小测试结束了,下面我们来演化一下我们之前的MQ脚本。之前在http://chenx1242.blog.51cto.com/10430133/1884415写了一个MQ脚本,不过那个MQ脚本有点理想哦,忘了加上“超时监控”和“如果重启”这两个功能失败,将发送邮件提醒运维人员”。这里我们将弥补以上两个不足。首先我们运行一下看看这个MQwatchdog脚本需要运行多长时间:从上面我们可以看出整个脚本运行大约需要13秒,所以我们考虑其他因素,将超时设置为20秒,执行效果如图:Return码为0,如果超时停止再看返回码。可以看出超时停止的返回码是124(ctrl+c手动退出的返回码是130),那么整个脚本就很容易写了,如下:然后直接在crontab中执行这个脚本。补充说明之一,在文章中测试超时命令时,我使用了ping。其实这个并不严谨,因为unixping默认会*重复,所以#timeout3spingwww.baidu.com不管有没有网络连接都会超时。这里最好的例子就是看看#timeout3ssleep1和#timeout3ssleep5的区别。第二个补充说明,在shell脚本中,如果timeout后面跟一个函数,是无效的!