bash 스크립트(중요한 경우 Ubuntu 22)에는 for...do 루프에서 실행되고 일부 SQLplus <query_name>.sql을 실행하고 결과를 < query_name>에 저장하는 파일 이름이 지정된 함수가 있습니다. CSV
성공 여부를 확인하고 방금 생성한 csv 파일의 크기를 인쇄하는 몇 가지 기능을 추가했습니다.
하지만... 세 가지 쿼리를 실행하고 성공 메시지에 파일 크기를 보고합니다. 문제 없습니다. 그러나 네 번째이자 마지막 항목의 경우 "Statx할 수 없습니다: 해당 파일이나 디렉터리가 없습니다"라는 오류가 발생합니다. 바로 거기에서 볼 수 있어요. 대안으로, 전체 프로세스가 디렉토리의 파일을 나열하도록 하면 그것이 나타납니다.
지난번과 같은 방식으로 작동하지 않는 이유를 알아보세요.
다음은 run_query() 및 Success_file() 함수에 대한 코드입니다. 제가 무엇을 하고 있는지 확인하시면 될 것 같습니다.
[단지 조각이 아닌 전체 스크립트 파일을 표시하도록 편집됨]
#!/bin/bash
source ~/overnights/scripts/.globals/.filenames
source ~/overnights/scripts/.globals/.creds
source ~/overnights/scripts/.globals/.commands.sh
echo "============================================================================="
echo "= Starting to fetch Banner data ="
echo "============================================================================="
# cleandrop() called from each sql script execution to finish the whole process if one file fails.
cleandrop () {
echo "`date`: Problems connecting to or fetching from Oracle. Cleaning up and exiting."
rm -f ${IN_BANNER}/*
cd $SCRIPT_DIR
exit 1
}
# Displays confirmations of which file we have just processed.
success_file () {
size=$(stat -c%s "$2")
echo "`date`: SQL script executed successfully for $1"
echo "`date`: Output file saved to $2 (${size} bytes)."
echo
}
# Given a query name from the array "queries" performs the query and saves the output.
run_query () {
SQL="${BANNER_SCRIPTS}/$1.sql"
CSV="${IN_BANNER}/$1.csv"
echo "`date`: Beginning ${SQL} processing."
sqlplus64 -S "${OUSER}/${OPASS}@//${OHOST}:${OPORT}/${OSID}" @${SQL}
# Check the exit status of sqlplus to see if the SQL script ran successfully
if [[ $? -eq 0 ]]
then
success_file ${SQL} ${CSV}
else
cleandrop
fi
}
# Try a connection just to make sure it works first otherwise exit
echo "exit" | sqlplus64 -L "${OUSER}/${OPASS}@//${OHOST}:${OPORT}/${OSID}" | grep Connected > /dev/null
if [[ $? -ne 0 ]]
then
cleandrop
else
echo "`date`: Connection checked okay, proceeding to fetch Banner data."
fi
# Remove files from previous runs if they exist.
cd $IN_BANNER
signal="${IN_BANNER}/DONE.txt"
if [[ -f "$signal" ]]
then
echo "`date`: Removing signal file ${signal}"
rm -f $signal
echo "`date`: Removing any previous data files in ${IN_BANNER}"
echo
rm -f ${IN_BANNER}/*.csv
fi
rm -f *
# Set up the array of query names to execute with run_query()
queries=( ora_SRS_PEOPLE
ora_SRS_COURSES
ora_SRS_ENROLS
ora_SRS_STAFF
)
for query in "${queries[@]}"
do
run_query ${query}
done
# drop in a signal file so other processes can tell if the downloads have completed.
echo "`date`: Creating completion signal file ${signal}"
touch ${signal}
echo
echo "`date`: Listing of data files collected in ${IN_BANNER}"
ls -lh ${IN_BANNER}
cd ${SCRIPT_DIR}
echo
echo "`date`: overnights_oracle.sh completed"
exit 0
...내가 본 결과는 다음과 같습니다.
=============================================================================
= Starting to fetch Banner data =
=============================================================================
Sat Oct 7 15:55:53 BST 2023: Connection checked okay, proceeding to fetch Banner data.
Sat Oct 7 15:55:53 BST 2023: Removing signal file /home/p0071665/overnights/data/downloads/banner/DONE.txt
Sat Oct 7 15:55:53 BST 2023: Removing any previous data files in /home/p0071665/overnights/data/downloads/banner
Sat Oct 7 15:55:53 BST 2023: Beginning /home/p0071665/overnights/scripts/sql/banner/ora_SRS_PEOPLE.sql processing.
Sat Oct 7 15:57:54 BST 2023: SQL script executed successfully for /home/p0071665/overnights/scripts/sql/banner/ora_SRS_PEOPLE.sql
Sat Oct 7 15:57:54 BST 2023: Output files saved to /home/p0071665/overnights/data/downloads/banner/ora_SRS_PEOPLE.csv (10776253 bytes).
Sat Oct 7 15:57:54 BST 2023: Beginning /home/p0071665/overnights/scripts/sql/banner/ora_SRS_COURSES.sql processing.
Sat Oct 7 15:58:04 BST 2023: SQL script executed successfully for /home/p0071665/overnights/scripts/sql/banner/ora_SRS_COURSES.sql
Sat Oct 7 15:58:04 BST 2023: Output files saved to /home/p0071665/overnights/data/downloads/banner/ora_SRS_COURSES.csv (3992287 bytes).
Sat Oct 7 15:58:04 BST 2023: Beginning /home/p0071665/overnights/scripts/sql/banner/ora_SRS_ENROLS.sql processing.
Sat Oct 7 16:01:07 BST 2023: SQL script executed successfully for /home/p0071665/overnights/scripts/sql/banner/ora_SRS_ENROLS.sql
Sat Oct 7 16:01:07 BST 2023: Output files saved to /home/p0071665/overnights/data/downloads/banner/ora_SRS_ENROLS.csv (26717546 bytes).
Sat Oct 7 16:01:07 BST 2023: Beginning /home/p0071665/overnights/scripts/sql/banner/ora_SRS_STAFF.sql processing.
Sat Oct 7 16:01:11 BST 2023: SQL script executed successfully for /home/p0071665/overnights/scripts/sql/banner/ora_SRS_STAFF.sql
Sat Oct 7 16:01:11 BST 2023: Output files saved to /home/p0071665/overnights/data/downloads/banner/ora_SRS_STAFF.csv ( bytes).
Sat Oct 7 16:01:11 BST 2023: Creating completion signal file /home/p0071665/overnights/data/downloads/banner/DONE.txt
Sat Oct 7 16:01:11 BST 2023: Listing of data files collected in /home/p0071665/overnights/data/downloads/banner
total 41M
-rw-r--r-- 1 p0071665 p0071665 0 Oct 7 16:01 DONE.txt
-rw-r--r-- 1 p0071665 p0071665 3.9M Oct 7 15:58 ora_SRS_COURSES.csv
-rw-r--r-- 1 p0071665 p0071665 26M Oct 7 16:01 ora_SRS_ENROLS.csv
-rw-r--r-- 1 p0071665 p0071665 11M Oct 7 15:57 ora_SRS_PEOPLE.csv
-rw-r--r-- 1 p0071665 p0071665 1.2M Oct 7 16:01 ora_SRS_STAFF_ENROLS.csv
실행할 때 콘솔에 표시되는 내용은 다음과 같습니다.
stat: cannot statx '/home/p0071665/overnights/data/downloads/banner/ora_SRS_STAFF.csv': No such file or directory
하지만 나는 그 파일이 거기에 있다는 것을 안다. 이동하고 복사할 수 있고 ls -al 등에 나열됩니다.
stat가 파일을 찾기 전에 파일을 "닫기" 위해 뭔가를 해야 하는지 궁금했지만, 통계를 수행하기 전에 파일에 "touch" 및 "remove" 신호를 추가했는데 아무런 효과가 없었습니다. 전적으로 중요한 것은 아니지만 실행 중인 쿼리 배열의 한 요소에서만 작동하지 않는 이유가 궁금합니다.
건배, 조크
답변1
코드에 오타가 있는 것 같습니다. 아니요 ora_SRS_STAFF.csv
, 따라서 오류 메시지는 정확합니다.
-rw-r--r-- 1 p0071665 p0071665 0 Oct 7 16:01 DONE.txt -rw-r--r-- 1 p0071665 p0071665 3.9M Oct 7 15:58 ora_SRS_COURSES.csv -rw-r--r-- 1 p0071665 p0071665 26M Oct 7 16:01 ora_SRS_ENROLS.csv -rw-r--r-- 1 p0071665 p0071665 11M Oct 7 15:57 ora_SRS_PEOPLE.csv -rw-r--r-- 1 p0071665 p0071665 1.2M Oct 7 16:01 ora_SRS_STAFF_ENROLS.csv