[LØST] Kørsel af script via Crontab - Forskelle fra normal kørsel
Hej Forum
Jeg har på mit arbejde lavet et lille script der gerne skulle importere noget data fra Excel til MySQL således det kan visualiseres for brugerne!
Fra vores ERP system exporteres 3 XLSX filer - som jeg via et script - gerne vil indsætte i databasen på en host.
Mit script virker upåklageligt så længe jeg kører det manuelt - Men når jeg kører det via Cronjob - ser alt OK - melder ingen fejl - Men indsætter ikke data til data basen - Så kan jeg manuelt efterfølgende køre jobbet og alt data kommer ind som forventet
Er der nogen der kan forklare dette - eller se hvad der mangler siden dette ikke vil køre automatisk
Jeg har lavet en config fil som indeholder password etc mm:
#!/bin/bash
#########################################################
# This script checks for .xlsx files and converts #
# these to .csv and inserts content into MySQL DB #
#########################################################
# External config/variables can be found in /.config.sh.
#Adding information from static config file
[ -r /scripts/meraimport/config.sh ] && . /scripts/meraimport/config.sh
#Splash Intro
echo "################################################" >> $LOG
echo "#Script indsætter data fra MERA. Build: rc-1.0c#" >> $LOG
echo "################################################" >> $LOG
echo " " >> $LOG
echo "Today is $FDATE and starting Mera Data Import." >> $LOG
echo " " >> $LOG
echo "Changing to import dir: $SYSTEMDIR" >> $LOG
cd $SYSTEMDIR
echo " " >> $LOG
echo "Looking for new Mera Exports..." >> $LOG
LIST=(`find ./ -maxdepth 1 -name "*.xlsx"`)
if [ ${#LIST[@]} -gt 0 ];
then
for f in *.xlsx
do
echo " $f - Found!" >> $LOG
done
echo " " >> $LOG
echo "Converting to .csv" >> $LOG
echo "This might take a while..." >> $LOG
for f in *.xlsx
do
/usr/local/bin/in2csv --no-inference $f > ./output/${f%.*}.csv 2> /dev/null
echo " $f - Done!" >> $LOG
done
echo " " >> $LOG
echo "Inserting Rows from generated .csv" >> $LOG
CSVLIST=(`find $SYSTEMDIR/output/ -maxdepth 1 -name "*.csv"`)
if [ ${#CSVLIST[@]} -gt 0 ];
then
for f in $SYSTEMDIR/output/*.csv
do
noPath=${f##*/}
noExt=${noPath%.*}
/usr/local/bin/csvsql --db mysql+mysqlconnector://$dbUser:$dbPass@$dbString:$dbPort/$dbSchema --tables $noExt --no-create --insert < $f >> $DLOG
echo " Success - inserting $noPath into Table: $noExt - Done!" >> $LOG
STATUS='0'
done
echo " " >> $LOG
echo "Cleaning up temporary files.." >> $LOG
rm ./output/*
echo " " >> $LOG
echo "Create save folder if not exist.." >> $LOG
if [[ ! -e $SAVEDIR ]];
then
mkdir $SAVEDIR
echo "Folder created" >> $LOG
elif [[ ! -d $SAVEDIR ]];
then
echo "$SAVEDIR already exists but is not a directory" >> $LOG
fi
echo " " >> $LOG
echo "Moving imported xlsx files to save directory" >> $LOG
mv merae744.xlsx $SAVEDIR/merae744_$DATE.xlsx
mv merae745.xlsx $SAVEDIR/merae745_$DATE.xlsx
mv merae746.xlsx $SAVEDIR/merae746_$DATE.xlsx
echo " " >> $LOG
echo "Done moving files - Deleting files above 7days" >> $LOG
# find $SYSTEMDIR/save/* -mtime +7 -exec rm {} \;
echo " " >> $LOG
echo "Changing permission on save folder" >> $LOG
chown -R mera:mera $SYSTEMDIR/save
echo " " >> $LOG
echo " - Done!" >> $LOG
echo " " >> $LOG
echo "Zipping the logfiles and prepare for mail." >> $LOG
cd /tmp
bzip2 -k -z --best dbinsert.log
echo " " >> $LOG
echo "Sending email to $ADMIN and closes the script." >> $LOG
STATUS='0'
else
echo "$FDATE - NO CONVERTED FILES FOUND..." >> $LOG
echo "Exiting Script - NO IMPORTED DATA.." >> $LOG
STATUS='1'
break
fi
else
echo "$FDATE: - No Files found!!!!" >> $LOG
echo "Verify that MERA has exported files" >> $LOG
echo "Exiting Script - NO IMPORTED DATA.." >> $LOG
STATUS='1'
fi
if [ $STATUS -gt 0 ];
then
mail -s "FAILURE IN MERA DATA IMPORT - $DATE" $IT < $LOG
echo "$FDATE: FAILUIRE importing mera Data - Investigate ASAP" >> $INSALOG
else
echo "$FDATE: SUCCESSFULL import of mera data" >> $INSALOG
cat $LOG |mutt -a $DLOG.bz2 -s "Success Mera Import Script: $DATE" -b $ANMO -b $KN -b$IT
rm -rf $DLOG.bz2
fi
#EOF
Meningen er dette script skal køre auto hver morgen og opdatere de seneste ordre indgang mm
Men jeg kan simpelthen ikke se hvor dette går galt - hvordet virker ved manuel kørsekl og ikke via crontab
PFT
P
- Log in to post comments
Kommentarer6
Noget med rettigheder?
Hvilken bruger kører du som manuelt?
Hvilken bruger kører cron som?
Begge som root
Både manuelt
Begge som root
Både manuelt og via crontab
Hvis det var mig, der havde
Hvis det var mig, der havde sådan et problem, ville jeg nok indsætte nogle flere informerende echo-kommandoer undervejs, som kunne afdække forskellene. F.eks. i dine for-løkker, indsætte et echo for hver, så man kunne tælle, hvor mange instanser, der findes. Så logfilen giver nogle indikationer af forskellene.
Tænker på, om der kan være et problem omkring nogle af de angivne fil-stier? At det ser forskelligt ud på de forskellige miljøer?
En ekstra ide: Tænker på
En ekstra ide: Tænker på (men ved det ikke) om cronjobbet sættes i gang fra en genvej. Så når scriptet kører:
LIST=(`find ./ -maxdepth 1 -name "*.xlsx"`)
så opfattes "./" som den mappe, hvorfra genvejen opererer, og så finder den ingen filer, da disse ligger andetsteds...
Ved i hvert fald at dette kan være et problem, når jeg kører scripts i en desktop-linux. At man skal lige huske med at CD'e sig ind i den rigtige mappe.
Gode kommentarer fra
Gode kommentarer fra ejvindh.
Kan du se, om scriptet konverterer xlxs-filerne til csv, når det kører som cron-job, eller om det fejler før konverteringen?
Det vil give nogle pejlemærker.
Fik løst det
Hovedsageligt
Fik løst det
Hovedsageligt er de fleste ting om fuld path - Men fik løst det ved at lave min $SYSTEMDIR således det kører den fulde sti
csvkit drillede en smule efterfølgende grundet unique kolloner og duplicates - Men fandt et prefix til csvsql som ignore
Så alle ting er løst nu!
P