Shell脚本:获取Solaris中失败的后台子进程的退出状态

时间:2011-01-18 10:40:58

标签: shell solaris

我已经编写了一个POC。这个代码在Linux中运行良好,但在Solaris中运行不正常。我使用的是Solaris 10

enter code here
#!/bin/sh
echo inside parent
echo executing child in the background
./remove deepti & # executing dummy command to make sure that background process fails
childpid=$!
i=0
while [ `ps -p $childpid >/dev/null; echo $?` = 0 ]; do
    sleep 5
    i=`expr $i + 1`
    if [ $i -gt 3 ]; then
        echo wait exceeded
        ps -p $childpid >/dev/null
        exit $?
    fi
done
wait $childpid
exit $?

我希望Wait会返回后台命令的退出状态。退出状态应为127。但是我的退出状态为0.

1 个答案:

答案 0 :(得分:2)

这不是一个bug,而是Solaris上/ bin / sh的预期和记录的行为。引自wait(1) manual page

如果pid不是活动进程ID,则wait实用程序将立即返回,返回代码将为0.

较早的Bourne shell文档没有指定在使用已经死的进程调用时应该执行的等待操作,因此结果是未定义的行为。修改了文件以澄清1998年的那一点.ksh是获得预期回报状态的推荐方法:http://bugs.opensolaris.org/bugdatabase/view_bug.do?bug_id=4068875

对于Solaris 10及更早版本,/ bin / sh是一种旧版脚本语言,不应与新代码一起使用。您宁愿使用/ bin / ksh或/ usr / xpg4 / bin / sh代替POSIX脚本。 Solaris 11 Express提供了POSIX / bin / sh,因此不会再发生这类问题。