等待subprocess,但得到错误:“PID不是这个壳的孩子”

我写了一个脚本从HDFS平行地获取数据,然后待这些subprocess在for循环中,但有时它返回“pid不是这个shell的subprocess”。 有时它运作得很好,它很困惑。 我使用“jobs -l”来显示所有在后台运行的作业。 我确定这些pid是shell进程的subprocess,我使用“ps aux”来确保这些pid是note分配给其他进程。 这是我的脚本。

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 

Solutions Collecting From Web of "等待subprocess,但得到错误:“PID不是这个壳的孩子”"

只要找到您想要等待的进程的进程ID,并在下面的脚本中用12345替换即可。 进一步的变化可以根据您的要求进行。

 #!/bin/sh PID=12345 while [ -e /proc/$PID ] do echo "Process: $PID is still running" >> /home/parv/waitAndRun.log sleep .6 done echo "Process $PID has finished" >> /home/parv/waitAndRun.log 

/usr/bin/waitingScript.sh

http://iamparv.blogspot.in/2013/10/unix-wait-for-running-process-not-child.html

无论是while循环还是for循环运行在一个子shell中,这就是为什么你不能等待(父,外)shell的孩子。

编辑这个可能会发生,如果while循环或for循环实际上

(a)在(b)块(b)中参与吹笛者(例如, for....done|somepipe