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