我有一个脚本尝试使用另一个程序建立数据库连接,程序的超时(2.5分钟)是长的.我想将此功能添加到脚本中.
如果连接需要5秒以上的时间,请终止进程
Else kill sleep/kill进程.
我遇到的问题是bash如何在进程被杀死时报告,这是因为进程只在后台处于同一个shell中.有没有更好的方法来执行此操作或如何使shell为kill命令静音?
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
Run Code Online (Sandbox Code Playgroud)
小智 114
有一个名为timeout的GNU coreutils实用程序:http://www.gnu.org/s/coreutils/manual/html_node/timeout-invocation.html
如果您在平台上拥有它,则可以:
timeout 5 CONNECT_TO_DB
if [ $? -eq 124 ]; then
# Timeout occurred
else
# No hang
fi
Run Code Online (Sandbox Code Playgroud)
Tac*_*der 10
我不知道它是否相同,但几年前我确实解决了类似的问题.然而,我是一个程序员,而不是像Unix一样的系统管理员,所以请注意以下几点,因为我的Bash-fu可能不那么强...
基本上我做了fork,fork和fork :)
内存不足在找回我的旧代码(我惊人地仍然每天使用)之后,因为我的内存不够好,在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
Run Code Online (Sandbox Code Playgroud)
其中sleepAndMaybeKill.sh睡你想要的时间量,然后杀死commandThatMayHand.sh.
所以基本上这两种情况是:
你的命令退出正常(在你的5秒超时之前或其他什么),所以一旦你的命令退出正常就等待停止(并杀死"杀手",因为它不再需要了
命令锁定,杀手最终杀死命令
在任何情况下,您都可以保证在命令完成后立即成功,或者在超时后立即失败.