我有一个脚本,尝试使用另一个程序进行数据库连接,程序的超时(2.5分钟)是长的。我想将此功能添加到脚本。
如果连接需要更长的时间5秒钟,可以杀死进程
否则杀死睡眠/杀死过程。
我遇到的问题是bash如何在进程被杀死时报告,这是因为进程在同一个shell中只是背景。有没有更好的方法来做到这一点,或者如何使shell命令的安静呢?
DB_CONNECTION_PROGRAM > $CONNECTFILE & pid=$! (sleep 5; kill $pid) & sleep_pid=$! wait $pid # If the DB Failed to connect after 5 seconds and was killed status=$? #Kill returns 128+n (fatal error) if [ $status -gt 128 ]; then no_connection="ERROR: Timeout while trying to connect to $dbserver" else # If it connected kill the sleep and any errors collect kill $sleep_pid no_connection=`sed -n '/^ERROR:/,$p' $CONNECTFILE` fi
我不知道它是否相同,但几年前我确实已经解决了类似的问题。不过我是一个程序员,而不是像Unix一样的系统管理员,所以采取以下一些盐,因为我的Bash-fu可能不是那么强大…
基本上我做叉子,叉子和叉子)
内存不足建立我的旧代码(我惊讶地仍然使用每天),因为我的记忆不够好,在Bash它的工作有点像这样:
commandThatMayHang.sh 2 > /dev/null 2>&1 & (notice that last '&',we're forking) MAYBE_HUNG_PID=$! sleepAndMaybeKill.sh $MAYBE_HUNG_PID 2 > /dev/null 2>&1 & (we're forking again) SLEEP_AND_MAYBE_KILL_PID=$! wait $MAYBE_HUNG_PID > /dev/null 2>&1 if [ $? -eq 0 ] # commandThatMayHand.sh did not hang,fine,no need to monitor it anymore kill -9 $SLEEP_AND_MAYBE_KILL 2> /dev/null 2>&1 fi
其中sleepAndMaybeKill.sh睡眠所需的时间,然后杀死commandThatMayHand.sh。
所以基本上这两种情况是:
>你的命令退出正常(超过5秒超时或任何时间),所以等待停止,一旦您的命令退出正常(并杀死“杀手”,因为它不再需要了
>该命令锁定,杀手最终杀死命令
无论如何,一旦命令完成,您就可以成功,或者在超时后失败。