Linux bash: 如果程序挂在那里,则程序超时并回显 'timeout'
Linux bash: timeout a program if the program hangs in there and echo 'timeout'
我有一个程序可以打印出通过或失败。我想检测挂在那里的程序并回显 'timeout'
我写了这样一个脚本:
#!/bin/bash
echo -n 'test' && timeout 5 ./mytest | grep -q -i 'passed' && echo ', passed'|| echo ', failed'
if [ $? -eq 124 ]; then
echo 'timeout'
fi
但它会将挂在那里的程序视为 'failed' 并终止该程序。任何建议将不胜感激。谢谢!
人工超时:
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
return代码$?正在迷路,因为您将多个命令组合在一行中。打破这一行:
echo -n 'test' && timeout 5 ./mytest | grep -q -i 'passed' && echo ', passed'|| echo ', failed'
&&和||组合的return命令代码是最后一个命令 运行。在失败的情况下,此命令为 echo ', failed'。此回显的 return 代码为 0。此外,通过管道传输的命令的 return 代码是最后一个最 return 代码(可通过 'set -o pipefail' 控制)。您可以使用 bash 中的 PIPESTATUS 数组获取第一个(以及所有其他)return 代码。
举例说明:
# 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
我有一个程序可以打印出通过或失败。我想检测挂在那里的程序并回显 'timeout'
我写了这样一个脚本:
#!/bin/bash
echo -n 'test' && timeout 5 ./mytest | grep -q -i 'passed' && echo ', passed'|| echo ', failed'
if [ $? -eq 124 ]; then
echo 'timeout'
fi
但它会将挂在那里的程序视为 'failed' 并终止该程序。任何建议将不胜感激。谢谢!
人工超时:
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
return代码$?正在迷路,因为您将多个命令组合在一行中。打破这一行:
echo -n 'test' && timeout 5 ./mytest | grep -q -i 'passed' && echo ', passed'|| echo ', failed'
&&和||组合的return命令代码是最后一个命令 运行。在失败的情况下,此命令为 echo ', failed'。此回显的 return 代码为 0。此外,通过管道传输的命令的 return 代码是最后一个最 return 代码(可通过 'set -o pipefail' 控制)。您可以使用 bash 中的 PIPESTATUS 数组获取第一个(以及所有其他)return 代码。 举例说明:
# 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