2014-11-16 2 views
0

두 개의 MD5 체크 합계 ($ SUMCHK1 & $ SUMCHK2)가이 스크립트에서 일치 할 때마다 가장 안쪽 while 루프에 걸려 스크립트가 끝나지 않습니다. 두 개의 로그 파일이 일치하면 두 개의 md5sum이 화면에 표시됩니다.가장 안쪽 while 루프에서 벗어날 수 없음 - Bash - Ubuntu

#!/bin/bash 

FULLPATH=$1 
FPS=$2 
AVI=$(basename $1) 
AVIDIR=$HOME/q7video/$AVI 
TMPFILE=$AVIDIR/tmp.txt 
TMPFILE2=$AVIDIR/tmp2.txt 
NEWFILES=$AVIDIR/tmp3.txt 
FFLOG=$AVIDIR/ffmpeg.log 
LOGFILE=$AVIDIR/log.log 
FACESDIR=$AVIDIR/faces 

# CREATE FOLDER STRUCTURE, NO ERROR IF DIR PRE-EXISTS 
mkdir --parents $AVIDIR 
mkdir --parents $FACESDIR 
touch $TMPFILE $TMPFILE2 $NEWFILES $LOGFILE 
echo $AVI > $LOGFILE 

# DUMP THUMBNAILS FROM SPECIFIED AVI FILE 
ffmpeg -i $FULLPATH -f image2 -vf fps=fps=$FPS $AVIDIR/$AVI%03d.jpg </dev/null >/dev/null 2>$FFLOG & 

# DELAY TO ALLOW LOOP A WORKING DIRECTORY BEFORE START 
sleep 2 

#TOUCH FILES TO PREVENT NO FILE ERROR 
touch $TMPFILE $TMPFILE2 

# INITIALIZE VARIABLE FOR LOOP 
CHECK=`pgrep ffmpeg` 
I=0 
SUMCHK1=`md5sum $TMPFILE` 
SUMCHK2=`md5sum $TMPFILE2` 

while [[ "$CHECK" -gt "$I" ]]; do 
    sleep 2 
    echo FFMPEG RUNNING 
    ls $AVIDIR/*.jpg > $TMPFILE 
    while [[ "$SUMCHK1" != "$SUMCHK2" ]]; do 
     comm -23 $TMPFILE $TMPFILE2 > $NEWFILES 
     while read F ; do 
      echo $F 
      echo $F >> $TMPFILE2 
      echo $F >> $LOGFILE 
      python opencvtest.py $F >> $LOGFILE 
     done < $NEWFILES 
     ls $AVIDIR/*.jpg > $TMPFILE 
     SUMCHK1=`md5sum $TMPFILE` 
     SUMCHK2=`md5sum $TMPFILE2` 
     echo $SUMCHK1 
     echo $SUMCHK2 
    done 
    CHECK=`pgrep ffmpeg` 
    echo $CHECK 
done 



# COPY IMAGES WITH A FACE TO FACESDIR 


# CLEANUP LOGS 
#rm $TMPFILE $TMPFILE2 $NEWFILES 
+3

두 변수는 체크섬이있는 파일의 이름을 포함하기 때문에 절대로 같은 값을 갖지 않습니다. – chepner

+0

왜 FFMPEG 인스턴스의 프로세스 ID를 0으로 비교합니까? – chepner

+1

예 내 측면에서 동일한 동작을 수행합니다. md5sum은 해시와 파일 이름을 출력합니다. '54328f6b27a45c51986ed436f3f609bf .profile'. 마지막 파트를'| cut -d "-f1' – Florent

답변

0

이 작업은 체크섬이 필요없이 수행 할 수 있습니다. 마찬가지로

# INITIALIZE VARIABLE FOR LOOP 
CHECK=`pgrep ffmpeg` 
I=0 

while [[ "$CHECK" -gt "$I" ]]; do 
    sleep 2 
    echo FFMPEG RUNNING 

    # get the current file list 
    ls -1 $AVIDIR/*.jpg | sort > $TMPFILE 

    # compare current file list with previous list and extract new file list 
    comm -23 $TMPFILE $TMPFILE2 > $NEWFILES 

    # process new files 
    while read F ; do 
     echo $F 
     echo $F >> $LOGFILE 
     python opencvtest.py $F >> $LOGFILE 
    done < $NEWFILES 

    # save the current file list to be used as previous list in next run 
    cp $TMPFILE $TMPFILE2 

    CHECK=`pgrep ffmpeg` 
    echo $CHECK 
done 

여담 루프 본체 한번 더 실행되어야 ffmpeg 후에는 반드시 화상의 마지막 세트 처리에서 제외되지 있도록 완료했다.

+0

팁 주셔서 감사. 그러나 나는이 변화와 함께 여전히 가장 내적인 루프에서 끝없는 실행을 얻고있다. –

+0

다른 루프 본문이 실행되어야 함을 의미합니까? 스크립트에서 모든 것을 다시 반복하지 않고도이 작업을 쉽게 수행 할 수 있습니까? –

+0

@KennyPowers 당신이 내부 루프를 말할 때, 그것은'while read F; do' 또는 ffmpeg 프로세스 상태를 확인하는 다른 프로세스입니까? 파이썬 스크립트를 주석 처리 할 때'읽는 동안 F ... '일이 생기면 어떻게 될까요? 그 주석을 달았을 때 새로운 이미지가 생성 될 때 새로운 파일 이름을 출력합니까? – Sithsu

관련 문제