试图在bash脚本中捕获stdout后台进程

时间:2013-06-24 19:30:29

标签: bash jenkins

我写下以下内容与Jenkins一起开始我的硒测试。现在,因为它们被作为后台进程执行,当它们失败时,Jenkins认为它们没有。正如你可以看到我徒劳地尝试这项工作。有任何想法吗?考虑将输出管道输出到文件中并使用grepping for keywords。然后我意识到如果字符串的grep返回true,我不知道如何反映错误。

#!/bin/bash

FAIL=0


echo "starting"


ruby /root/selenium-tests/test/test1.rb &   
ruby /root/selenium-tests/test/test2.rb & 
ruby /root/selenium-tests/test/test3.rb & 

#wait

for job in `jobs -p`
do
    echo $job
    wait $job || let "FAIL+=1"
done

echo $FAIL

if [ "$FAIL" == "0" ];
then

   echo  "PASS"

else

    echo "FAIL! ($FAIL)"

fi

1 个答案:

答案 0 :(得分:3)

Jenkins很可能会查看进程退出代码以确定测试是否失败。这就是所有Unix工具的功能。

有多种方法可以做到这一点。如果您的测试文件输出类似“FAIL”的内容而不是正确返回退出代码,则可以执行以下操作:

#!/bin/bash
(
  ruby /root/selenium-tests/test/test1.rb &   
  ruby /root/selenium-tests/test/test2.rb & 
  ruby /root/selenium-tests/test/test3.rb & 
  wait
) > log

! grep "FAIL" log
exit $?  # <- happens implicitly at the end of the script, and can be left out

在这种情况下,grep发现“FAIL”会导致脚本失败,Jenkins会检测到失败。

如果您的脚本返回正确的退出代码,更正确的方法是您的方法,但不依赖于作业控制(默认情况下在非交互式shell中关闭),并返回正确的退出代码:

for test in /root/selenium-tests/test/test*.rb
do
    ruby "$test" &
    pids+=( $! )
done

for pid in "${pids[@]}"
do
    if wait $pid
    then
        echo "$pid succeeded"
    else
        echo "$pid failed"
        (( failures++ ))
    fi
done

if [[ $failures -gt 0 ]]
then
    echo "FAIL: $failures failed tests"
    exit 1  # return failure
else
    echo "PASS!"
    exit 0  # return success
fi