Tôi viết một kịch bản để lấy dữ liệu từ HDFS song song , sau đó tôi chờ đợi các quá trình con trong vòng lặp for, nhưng đôi khi nó trả về "pid không phải là một đứa trẻ của vỏ này ". đôi khi, nó hoạt động tốt. Nó rất bối rối. Tôi sử dụng "jobs -l" để hiển thị tất cả các công việc đang chạy trong nền. Tôi chắc chắn những pid là quá trình con của quá trình vỏ, và tôi sử dụng "ps aux" để đảm bảo rằng các pids là lưu ý gán cho quá trình khác. Đây là kịch bản của tôi.chờ đợi quá trình con nhưng nhận được lỗi: 'pid không phải là một đứa trẻ của vỏ này'
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
Cả tôi đặt những vòng trong {...} khối, và cũng không sử dụng cho .... làm | somepipe. – henshao
Bạn có thể kiểm tra dòng suy nghĩ này, tuy nhiên, ví dụ: in $ BASHPID, $$, $ BASH_SUBSHELL ở cả hai vị trí (và ở mức to lớn của tập lệnh của bạn!) – sehe