attendez que le processus enfant mais d'erreur: "pid n'est pas un enfant de cette coquille"
J'écris un script pour obtenir des données à partir de HDFS parallèle,puis-je attendre de l'enfant ces processus dans une boucle for, mais parfois, il retourne "pid n'est pas un enfant de cette coquille". parfois, il fonctionne bien。C'est tellement perplexe. J'utilise les "emplois -l" pour afficher toutes les emplois exécuter en arrière-plan. Je suis sûr que ces pid du processus fils du processus du shell, et j'utilise "ps aux" pour s'assurer que ces pid n'est pas l'attribuer à d'autres processus. Voici mon 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
- Une bonne question, j'obtiens exactement la même erreur. J'ai lancé 96 tâches en arrière-plan et attendu pour eux. 4 de 96 m'a donné le "pid 28991 (ce nombre est le hasard de l'enfant PID par exemple) n'est pas un enfant de cette coquille". Je suppose que la commande d'attente n'est pas infaillible. Je vais faire quelques recherches.
Vous devez vous connecter pour publier un commentaire.
Il suffit de trouver l'id de processus du processus que vous souhaitez attendre et remplacez la par 12345 dans le script ci-dessous. D'autres changements peuvent être faits selon votre condition.
/usr/bin/waitingScript.sh
http://iamparv.blogspot.in/2013/10/unix-wait-for-running-process-not-child.html
waitpid
c'est en gros ce one-liner:while [ -e /proc/$1 ]; do sleep 1; done
...Soit votre boucle while ou la boucle for s'exécute dans un shell interne est exécuté, qui est pourquoi vous ne pouvez pas attendre d'un enfant de l' (parent, extérieur) - shell.
Modifier ce qui pourrait arriver si la boucle while ou for la boucle est en fait
(a) dans un
{...}
bloc(b) la participation à un piper (par exemple
for....done|somepipe
)