最近遇到一个数据库方面的问题,数据库所在的文件系统处于read-only状态以后,DB2实例虽然已经启动,这时连接数据库,会hung在那里,很久没有反应,并且db2diag日志里面有大量的错误信息抛出。
这篇短文并不是讨论这个问题怎么解决,因为解决起来很简单。有时候遇到一个问题以后,会突然反思之前的一些设计,联想到之前工作中的不妥之处。
我想到我多年之前写的一个关于监控DB2状态的的脚本,其中有一个监控是连接数据库,看是否能够获得数据库连接,当时是采用的方式是:
-
rtnValue=`db2 connect to ${dbName}`
然后判断rtnValue是否为0
从最近遇到的这个问题来看,这个方式是存在问题的,如果很久得不到连接,这个脚本的执行就会hung在这里,不能及时的返回监控结果。
那么怎么解决这个问题那?可以借助 timeout
-
timeout 30s db2 "connect to ${dbName}"
rtnValue=$?
通过timeout的方式,这个命令会在30秒内返回。如果发生了上面的这个问题,rtnValue会是 124,否则就是这个命令 db2 "connect to ${dbName}"的返回值。
关于timeout的详细信息可以看
timeout --help
...
If the command times out, and --preserve-status is not set, then exit with status 124. Otherwise, exit with the status of COMMAND.