我已经编写了一个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.
答案 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,因此不会再发生这类问题。