PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Cron Script



ottscho
24.09.07, 08:12
Hallo Zusammen,

ich habe ein Scriptproblem und kann es nicht genau nachvollziehen.
Unter Suse 10 funktioniert es einwandfrei und unter Ubuntu nicht.
Wenn ich das Script von Hand ausführe, geht es auch, aber wenn ich es über den Cron laufen lasse, wird es einfach nicht fertig ausgeführt.

Vllt weiß jmd von euch weiter, anbei der Code:


#!/bin/csh
#----------------------------------------------------------------------------

set echo = 1


# Set global variables and
# environment for script
#-------------------------
unalias cd
set date = `date "+%Y.%h.%d %T"`
set date2 = `date "+%Y.%h.%d.%T"`
set back_dir = $cwd

##

set DBS_NAMES = ('genesis')
set DBS_PATHS = ('/work/twraid/dbs_genesis')
set EXPORT_TMP = /var/genesis
set SAVED_JOBS_LIST = /genesis/etc/saved_jobs


if (! -d $EXPORT_TMP/logs) mkdir $EXPORT_TMP/logs

if (-e $SAVED_JOBS_LIST) then
cp $SAVED_JOBS_LIST /tmp
mv $SAVED_JOBS_LIST $EXPORT_TMP/logs/saved_jobs.$date2
set jobs2export = (`cat $EXPORT_TMP/logs/saved_jobs.$date2`)
else
echo "No Jobs to Export" | tee -a $EXPORT_TMP/logs/auto_export.log
exit
endif

echo "Start: ---- ${date} -------" | tee -a $EXPORT_TMP/logs/auto_export.log

foreach jobname ($jobs2export)
# Check if job is genesislib
if ($jobname == "genesislib") continue

# Check in which database the job is
#-----------------------------------
echo "---------- Job: $jobname --------" | tee -a $EXPORT_TMP/logs/auto_export.log
echo "Date : $date" | tee -a $EXPORT_TMP/logs/auto_export.log
set dbs_found = ""
foreach dbs ($DBS_PATHS)
if (-d ${dbs}/jobs/${jobname}) then
set dbs_found = $dbs
echo "Job: $jobname found in $dbs_found" | tee -a $EXPORT_TMP/logs/auto_export.log
break
endif
end
# If the Job was not found
if ($dbs_found == "") then
echo "Error: Job: $jobname not found in a database" | tee -a $EXPORT_TMP/logs/auto_export.log
continue
endif

# Change to the database and tar the job
cd ${dbs_found}/jobs
echo "Creating Archive of Job: $jobname" | tee -a $EXPORT_TMP/logs/auto_export.log
tar cf $EXPORT_TMP/${jobname}.tar $jobname

# Change to the EXPORT_TMP dir and
# Gzip the tared job, unzip it and compare it
cd $EXPORT_TMP

echo "Compressing Jobarchive: ${jobname}.tar" | tee -a $EXPORT_TMP/logs/auto_export.log
gzip -c ${jobname}.tar > ${jobname}.tgz

echo "Uncompressing Jobarchive: ${jobname}.tgz" | tee -a $EXPORT_TMP/logs/auto_export.log
gunzip -c ${jobname}.tgz > ${jobname}.chk

# Compare the files
echo "Comparing files: ${jobname}.tar ${jobname}.chk" | tee -a $EXPORT_TMP/logs/auto_export.log
cmp -s ${jobname}.tar ${jobname}.chk
if ($status) then
echo "Error: Job: $jobname inconsistent" | tee -a $EXPORT_TMP/logs/auto_export.log
echo "Moving the files to the logs dir" | tee -a $EXPORT_TMP/logs/auto_export.log
mv ${jobname}* logs
else
rm ${jobname}.tar ${jobname}.chk
mv -f ${jobname}.tgz /work/twraid/tgz_tmp
echo "OK" | tee -a $EXPORT_TMP/logs/auto_export.log
endif

end

cd $back_dir

#***EOF***


Wie gesagt, wenn ich es von Hand ausführe, funktioniert es und das Script läuft komplett durch.Mit Cron bleibt es nach dieser Zeile stehen:


echo "Start: ---- ${date} -------" | tee -a $EXPORT_TMP/logs/auto_export.log


Das echo steht noch im Log, und dann ist vorbei.
Hoffen kann mir jmd von euch weiterhelfen.

Danke
Gruß

ottscho

baumgartner
24.09.07, 08:18
Vielleicht ist die jobs2export leer wenn du das Script nicht als $USER ausführst?

Rechteproblem bei

set jobs2export = (`cat $EXPORT_TMP/logs/saved_jobs.$date2`) ?

ottscho
24.09.07, 08:32
Wenn ich mit crontab -e das Script anlege, wird es doch als User ausgeführt. Oder täusche ich mich?

Ich erweitere mal das Script, und wenn die Jobs2export leer ist, soll ein Kommentar in die Logs geschrieben werden.

ottscho
24.09.07, 08:55
@baumgartner

Du hast Recht, die jobs2export ist leer.
Obwohl sich in der Datei $EXPORT_TMP/logs/saved_jobs.$date2 was befindet...

Wie starte ich den Job als $user?
Ich dachte immer, dass es unter dem User läuft, unter dem ich Crontab -e erstelle...

Danke für die Hilfe

Gruß ottscho

baumgartner
24.09.07, 09:40
Normalerweise sollte das Skript schon als der Benutzer laufen sofern du es mit crontab -e bearbeitet hast und nicht über die files aus /etc/cron...

Mach doch mal ein echo $USER in dem Skript, dann siehst du als welcher Benutzer es in Cron läuft.

ottscho
25.09.07, 07:27
ich verstehe es nicht. habe nun das echo $user reingeschrieben.
wenn ich es wieder von hand ausführe, klappt alles und der user wird auch angezeigt. mache ich es mit der cron, funktioniert es bis hier her:


if (-e $SAVED_JOBS_LIST) then
cp $SAVED_JOBS_LIST /tmp
mv $SAVED_JOBS_LIST $EXPORT_TMP/logs/saved_jobs.$date2
set jobs2export = (`cat $EXPORT_TMP/logs/saved_jobs.$date2`)
else
echo "No Jobs to Export" | tee -a $EXPORT_TMP/logs/auto_export.log
exit
endif


danach passiert nichts mehr und in der erzeugten auto_export.log steht nichts mehr drin.

kann es noch daran liegen, dass ich nicht die bash verwende sonder die csh?
aber durch eintragen in die crontab -e, werden die die uservariablen verwendet....

marce
25.09.07, 07:35
aber durch eintragen in die crontab -e, werden die die uservariablen verwendet....
Was meinst Du damit?

Wenn Du auf $PATH und anderes anspielst - die Cron-Umgebung ist anders als die Login-Umgebung, da bei Cron z.B. .login, .bashrc, .profile und ähnliches nicht ausgeführt wird.

baumgartner
25.09.07, 08:27
crontab -l
/usr/bin/csh das_skript.csh oder so in der Art (Syntax) ;-)

Dann sollte es auch mit der Umgebung passen.

marce
25.09.07, 08:42
in dem Fall wird die Umgebung, die man als User nach dem Login und einer csh vorfindet, nicht vorhanden sein...

ottscho
25.09.07, 08:52
Morgen,

als im Moment sieht meine Cron so aus:


genesis@ubuntu-edv:/home/genesis>crontab -l
# Shell variable for cron
SHELL=/bin/csh
# PATH variable for cron
PATH=/usr/local/bin:/usr/local/sbin:/sbin:/usr/sbin:/bin:/usr/bin:/usr/bin/X11
# m h dom mon dow command
50 * * * * /var/genesis/export-script.csh
#40 * * * * date >> /tmp/date.log
#-----------------------------------------------------


und ich kann sagen, dass ich anhand dem erzeugten logfile sehe, dass das script bis hier abläuft =>


#!/bin/csh
#----------------------------------------------------------------------------

set echo = 1


# Set global variables and
# environment for script
#-------------------------
unalias cd
set date = `date "+%Y.%h.%d %T"`
set date2 = `date "+%Y.%h.%d.%T"`
set back_dir = $cwd

##

set DBS_NAMES = ('genesis')
set DBS_PATHS = ('/work/twraid/dbs_genesis')
set EXPORT_TMP = /var/genesis
set SAVED_JOBS_LIST = /genesis/etc/saved_jobs


if (! -d $EXPORT_TMP/logs) mkdir $EXPORT_TMP/logs

if (-e $SAVED_JOBS_LIST) then
cp $SAVED_JOBS_LIST /tmp
mv $SAVED_JOBS_LIST $EXPORT_TMP/logs/saved_jobs.$date2
set jobs2export = (`cat $EXPORT_TMP/logs/saved_jobs.$date2`)
else
echo "No Jobs to Export" | tee -a $EXPORT_TMP/logs/auto_export.log
exit
endif


alles was darunter kommet, wird nicht gemacht. sprich das moven nach EXPORT_TMP wurde gemacht, aber dann das Abarbeiten bzw. nicht ein mal die Ausagbe echo "Start: ---- ${date} -------" | tee -a $EXPORT_TMP/logs/auto_export.log funktioniert...