0

I have pratically 0 experience on unix and few on mysql and I am finding hard where to start to complete this task, I have to write a .sh file to launch once a day.

I have a table on OracleDb where I have 2 columns I need: path and file_name.

SELECT path, file_name FROM table WHERE date=trunc(sysdate);

Once I get the results, I should loop through the file system to check if the file in its path exists, if it does not, the script should sleep for few minutes and repeat from the query.

if it does find every file, then it's completed.

1 Answer 1

1

me!

I solved this with this recursive function

execute_check(){
SEC_TO_WAIT=300
NUM_SEC=$1
if [ "NUM_SEC${NUM_SEC}" = "NUM_SEC" ]; then
    echo "Not waiting"
else 
    echo "Wait "${NUM_SEC}" seconds"
     sleep ${NUM_SEC}
fi 

echo "===========================================" 2>&1 | tee -a ${LOG_FILE}
echo "=     TRY QUERY ON DB           =" 2>&1 | tee -a ${LOG_FILE}
echo "===========================================" 2>&1 | tee -a ${LOG_FILE}

sqlplus -S ${USERSQL}/${PWDSQL}@${DB} > ${SPOOL_FAKE} << EOF
WHENEVER SQLERROR EXIT 1
    SET SERVEROUTPUT ON SIZE 1000000;
    SET ARRAYSIZE 1;
    SET LINESIZE 4000;
    SET HEADING  OFF;
    SET TRIMSPOOL ON;
    SET TIMING OFF;
    spool ${FLUSSO_ELAB};
    
    
    select path, file_name
    from table
    where date=trunc(sysdate);
    
    spool off;
EOF
RESULT=$?
echo "Query result" $RESULT


    
if [ ${RESULT} = 0 ]; then
    echo "===========================================" 2>&1 | tee -a ${LOG_FILE}
    echo "=     CHECKING FILES EXISTENCE       =" 2>&1 | tee -a ${LOG_FILE}
    echo "===========================================" 2>&1 | tee -a ${LOG_FILE}
else
  echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" 2>&1 | tee -a ${LOG_FILE}
  echo "!  Error:                               !" 2>&1 | tee -a ${LOG_FILE}
  echo "!  error in the query to DB         !" 2>&1 | tee -a ${LOG_FILE}
  echo "!  Exit code: ${RESULT}                         !" 2>&1 | tee -a ${LOG_FILE}
  echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" 2>&1 | tee -a ${LOG_FILE}
  exit 1
fi

    
# remove first and last row before the loop since they are empty
sed 1d ${SPOOL_FAKE} > ${FLUSSO_ELAB}
rm ${SPOOL_FAKE}
mv ${FLUSSO_ELAB} ${SPOOL_FAKE}

sed '$d' ${SPOOL_FAKE} > ${FLUSSO_ELAB}
rm ${SPOOL_FAKE}
mv ${FLUSSO_ELAB} ${SPOOL_FAKE}


#trasform whitespace in /
sed -i 's/ /\//g' ${SPOOL_FAKE}



while [ `wc -l ${SPOOL_FAKE} | awk -F " " '{print $1}'` -ge 1 ]
    do
        echo "-----------------------------------------------------------------------------------------------"
            
        FILE=`head -1 ${SPOOL_FAKE}` 
        
        FILE=${FILES_DIR}/${FILE}
        echo "Search for file: "${FILE}  2>&1 | tee -a ${LOG_FILE}
            
    if [ -f ${FILE} ]; then
            echo "File: "${FILE}" exists."  2>&1 | tee -a ${LOG_FILE}
    else
        echo "File: "${FILE}" does NOT exist."  2>&1 | tee -a ${LOG_FILE}
        execute_check ${SEC_TO_WAIT} 
    fi;
            
        
        # ----------------------------------------------------------------------------------------------
        # DELETE FIRST ROW TO MOVE FORWARD THE LOOP
        # ----------------------------------------------------------------------------------------------
        sed 1d ${SPOOL_FAKE} > ${FLUSSO_ELAB}
        rm ${SPOOL_FAKE}
        mv ${FLUSSO_ELAB} ${SPOOL_FAKE}
    done
}

Called in another .sh, where you initialized the variables

FILES_DIR=${ROOT}/files
SPOOL_FAKE=${ROOT}/log/SpoolFake.txt
FLUSSO_ELAB=${ROOT}/log/FlussoElab.txt
execute_check 0
Sign up to request clarification or add additional context in comments.

1 Comment

plus one for the effort of writing the answer to your question.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.