[LØST] Kørsel af script via Crontab - Forskelle fra normal kørsel

peque
Antal: 979
Tilmeldt:
20-04-2005
User is offline
[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


mich
mich's picture
Antal: 1030
Tilmeldt:
13-10-2007
User is offline
Noget med rettigheder?

Hvilken bruger kører du som manuelt?
Hvilken bruger kører cron som?

./mich


peque
Antal: 979
Tilmeldt:
20-04-2005
User is offline
Begge som root Både manuelt

Begge som root

Både manuelt og via crontab


ejvindh
Antal: 153
Tilmeldt:
17-05-2010
User is offline
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?


ejvindh
Antal: 153
Tilmeldt:
17-05-2010
User is offline
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.


mich
mich's picture
Antal: 1030
Tilmeldt:
13-10-2007
User is offline
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.

./mich


peque
Antal: 979
Tilmeldt:
20-04-2005
User is offline
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