为什么后台进程会在后台进程退出状态1时强制父进程退出?

时间:2013-12-09 06:20:36

标签: linux bash

我的Bash代码:

#!/bin/sh
set -ex
function func ()
{
    sleep $1
        echo $1
if [ $1 -eq 10 ]; then
 exit 1
fi
}

func 10 &
pid_a=$!
func 5 &
pid_b=$!
func 3 &
pid_c=$!
wait $pid_b
if [ $? -eq 0 ];then echo "b.ksh SUCCESS"; else echo "b.ksh FAILED"; fi
wait $pid_c
if [ $? -eq 0 ];then echo "c.ksh SUCCESS"; else echo "c.ksh FAILED"; fi
wait $pid_a
if [ $? -eq 0 ];then
echo "a.ksh SUCCESS"; else echo "a.ksh FAILED"; fi

在启用set -ex时运行:

sh-4.2$ ./ex.sh 
+ pid_a=16341
+ func 10
+ pid_b=16342
+ sleep 10
+ func 5
+ pid_c=16343
+ sleep 5
+ wait 16341
+ func 3
+ sleep 3
+ echo 3
3
+ '[' 3 -eq 10 ']'
+ echo 5
5
+ '[' 5 -eq 10 ']'
+ echo 10
10
+ '[' 10 -eq 10 ']'
+ exit 1

此处父母也退出状态1退出的后台进程。 你能解释一下原因吗?

2 个答案:

答案 0 :(得分:3)

你做不到

command
if [ $? -eq 0 ]; then ...

set -e - 使用脚本。由于命令的非零退出状态甚至到达if之前脚本将结束。

wait报告等待进程的退出状态为自己的退出状态(或者$?检查无论如何都是毫无意义的)。试试这个:

if wait $pid_x; then
 echo "x.ksh SUCCESS"
else
 echo "x.ksh FAILED"
fi

答案 1 :(得分:1)

bash手册中提到set -e

  

-e如果一个简单的命令(参见上面的SHELL GRAMMAR)以非零状态退出,则立即退出。该                         如果失败的命令是紧跟在a之后的命令列表的一部分,则shell不会退出                         whileuntil个关键字,if语句中的部分测试,&&||列表的一部分,或者                         命令的返回值通过!反转。 ERR上的陷阱(如果已设置)在执行之前执行                         shell退出。

它没有说'当后台进程以非零状态退出时,shell将不会终止' - 所以它在后台进程失败时终止。