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.
CodePudding user response:
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