在给定时间之后杀死进程?

LF4*_*LF4 28 bash kill

我有一个脚本尝试使用另一个程序建立数据库连接,程序的超时(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)

  • 在Mac上:brew install coreutils.现在命令是gtimeout. (9认同)

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.

所以基本上这两种情况是:

  1. 你的命令退出正常(在你的5秒超时之前或其他什么),所以一旦你的命令退出正常就等待停止(并杀死"杀手",因为它不再需要了

  2. 命令锁定,杀手最终杀死命令

在任何情况下,您都可以保证在命令完成后立即成功,或者在超时后立即失败.