Я пишу script для получения данных из HDFS parrallel, тогда я жду этих дочерних процессов в цикле for, но иногда он возвращает "pid не является дочерним элементом этой оболочки". иногда это работает хорошо. Это так озадачено. Я использую "jobs -l", чтобы показать все задания, выполняемые в фоновом режиме. Я уверен, что эти pid - это дочерний процесс процесса оболочки, и я использую "ps aux", чтобы убедиться, что эти pids отмечены назначением другому процессу. Вот мой script.
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
