【发布时间】:2011-11-08 09:58:35
【问题描述】:
我写了一个脚本从HDFS并行获取数据,然后我在for循环中等待这些子进程,但有时它返回“pid is not a child of this shell”。有时,它运作良好。它很困惑。我使用“jobs -l”来显示所有在后台运行的作业。我确信这些 pid 是 shell 进程的子进程,我使用“ps aux”来确保这些 pid 被注意分配给其他进程。这是我的脚本。
PID=()
FILE=()
let serial=0
while read index_tar
do
echo $index_tar | grep index > /dev/null 2>&1
if [[ $? -ne 0 ]]
then
continue
fi
suffix=`printf '%03d' $serial`
mkdir input/output_$suffix
$HADOOP_HOME/bin/hadoop fs -cat $index_tar | tar zxf - -C input/output_$suffix \
&& mv input/output_$suffix/index_* input/output_$suffix/index &
PID[$serial]=$!
FILE[$serial]=$index_tar
let serial++
done < file.list
for((i=0;i<$serial;i++))
do
wait ${PID[$i]}
if [[ $? -ne 0 ]]
then
LOG "get ${FILE[$i]} failed, PID:${PID[$i]}"
exit -1
else
LOG "get ${FILE[$i]} success, PID:${PID[$i]}"
fi
done
【问题讨论】:
-
一个好问题,我得到了完全相同的错误。我启动了 96 个后台作业并等待它们。 96 个中的 4 个给了我“pid 28991(这个数字是随机子 PID 为例)不是这个 shell 的孩子”。我假设等待命令不是万无一失的。我会做一些挖掘工作。