Linux bash:如果程序在那里挂起并且回显'超时'

时间:2015-03-26 03:44:07

标签: linux bash grep timeout

我有一个打印出通过或失败的程序。我想检测挂在那里的程序并回显'超时'

我写了一个这样的脚本:

#!/bin/bash

echo -n 'test' && timeout 5 ./mytest | grep -q -i 'passed' && echo ', passed'|| echo ', failed'

if [ $? -eq 124 ]; then
    echo 'timeout'
fi

但它会把程序挂在那里作为'失败'并杀死程序。任何建议将不胜感激。谢谢!

2 个答案:

答案 0 :(得分:5)

man timeout:

NAME
       timeout - run a command with a time limit

SYNOPSIS
       timeout [OPTION] DURATION COMMAND [ARG]...
       timeout [OPTION]

DESCRIPTION
   Start COMMAND, and kill it if still running after DURATION.
...

以下是一个例子:

cmd_output=`timeout 5 ./mytest`

if [ $? -eq 124 ]; then
    echo 'timeout'
else
    echo $cmd_output
fi

答案 1 :(得分:0)

返回码$?因为你在一行上组合了几个命令而迷路了。打破这一行:

echo -n 'test' && timeout 5 ./mytest | grep -q -i 'passed' && echo ', passed'|| echo ', failed'

命令的返回码与&&组合和||是最后一个命令运行。在失败的情况下,此命令是echo',失败'。此回声的返回码为0.此外,管道连接在一起的命令的返回码是最后一个返回码(可以通过' set -o pipefail'进行控制)。您可以使用bash中的PIPESTATUS数组获取第一个(以及所有其他)返回码。 举例说明:

# the droid you want
timeout 5 sleep 100
echo $?
124

# the droid you want is in ${PIPESTATUS[0]}
$ timeout 5 sleep 100 | grep -q -i 'passed'
Terminated
$ echo $? PIPESTATUS[0]=$PIPESTATUS all=${PIPESTATUS[@]}
143 PIPESTATUS[0]=124 all=124 143

# the droid you want is gone
$ timeout 5 sleep 100 | grep -q -i 'passed' && echo ', passed'|| echo ', failed'
Terminated
, failed
$ echo $? PIPESTATUS[0]=$PIPESTATUS all=${PIPESTATUS[@]} ${PIPESTATUS[0]}
0 PIPESTATUS[0]=0 all=0 0