Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果bash中的一个后台进程失败,如何使整个主进程失败?_Bash_Gitlab Ci - Fatal编程技术网

如果bash中的一个后台进程失败,如何使整个主进程失败?

如果bash中的一个后台进程失败,如何使整个主进程失败?,bash,gitlab-ci,Bash,Gitlab Ci,所以基本上我需要 同时运行存根,服务器和等待 当等待完成时,运行测试 如果存根或服务器失败,则带有等待和测试的主进程也应该失败(否则它会一直挂在那里,直到超时1小时) 剩下的胡言乱语是我最初的问题: 我正在gitlab ci中运行e2e测试。简化脚本如下所示: stubs & server & wait-on && test wait-on是检查服务器何时开始响应特定url,然后测试开始运行。问题是,如果存根或服务器失败,我如何使整个ci作业失败 在晴天场景

所以基本上我需要

  • 同时运行
    存根
    服务器
    等待
  • 等待
    完成时,运行
    测试
  • 如果
    存根
    服务器
    失败,则带有
    等待
    测试
    的主进程也应该失败(否则它会一直挂在那里,直到超时1小时)
剩下的胡言乱语是我最初的问题: 我正在gitlab ci中运行e2e测试。简化脚本如下所示:

stubs & server & wait-on && test
wait-on是检查服务器何时开始响应特定url,然后测试开始运行。问题是,如果
存根
服务器
失败,我如何使整个ci作业失败

在晴天场景中,它们在后台运行,直到测试结束,容器被杀死,但是在雨天场景中,当至少有一个容器无法编译时,如何杀死容器呢

更新:我好像没说清楚,对不起。因此有两种情况:

  • sunny:存根和服务器被编译,并永远在后台运行(直到
    测试完成后容器被杀死)-这一切正常

  • 雨:
    存根
    服务器
    无法编译。在这种情况下,wait-on将永远等待,直到容器被超时杀死(在我的情况下是1个小时)-这就是我想要改进的地方:我不想等待一个小时,但只要
    存根
    服务器
    出现故障,就以错误完成所有操作


  • 感谢您的帮助,我对bash非常不了解,很抱歉,如果存根或服务器使用pkill失败,您可以终止主测试进程

    { stubs || pkill -f test; } & { server || pkill -f test; } & wait-on && test
    

    多亏了

    只需检查后台进程的退出状态

    stubs &
    stubspid=$!
    server &
    serverpid=$1
    if wait-on && wait "$stubspid" && wait "$serverpid"; then
        echo "SUCCESS"
    else 
        echo "FAILURE"
    fi
    

    只需在后台进程上等待
    。什么是测试点<如果在没有参数的情况下执行代码>测试将始终以非零退出状态退出。包括a。我没有否决投票,但如果在成功运行
    存根
    服务器
    时只是永远运行,这将不起作用。但是假设
    等待并测试
    成功,您可能会同时杀死
    存根
    服务器
    并声明成功。如果任何一个后台进程失败,则测试应该失败。(如果没有,那么测试没有正确执行其工作。)Och,我理解了
    服务器
    存根
    只是在
    等待
    完成后退出,因为“ci作业”引用-我假设这是某种运行ci/cd管道作业,
    等待
    测试某种工作,然后一切都退出,包括后台进程。我认为除非OP指定它是什么,否则我们只能猜测。我的印象是启动代码和测试都是同一管道的一部分。
    if
    语句实际上类似于
    if-wait-on&&tests&&wait“$stubsid”&&wait“$serverpid”;然后
    ,直到两个后台作业完成,管道才会退出。
    终止管道,而不是列表。它在前台运行
    stubs
    ,如果失败,则在后台运行
    pkill-f测试。请尝试
    {stubs;pkill-f test;}&