Linux bash:如果程序挂机并回显'timeout',则程序超时



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

我写了一个这样的脚本:

#!/bin/bash
echo -n 'test' && timeout 5 ./mytest | grep -q -i 'passed' && echo ', passed'|| echo ', failed'
if [ $? -eq 124 ]; then
    echo 'timeout'
fi

但它会将挂在那里的程序视为"失败"并终止该程序。如有任何建议,我们将不胜感激。谢谢

人工超时:

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

返回代码$?正在丢失,因为您在一行中组合了多个命令。打破这条线:

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

与&并且||是最后一次运行的命令。在失败的情况下,此命令为echo",failed"。此回波的返回代码为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

相关内容

  • 没有找到相关文章

最新更新