• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Linux Script funktioniert nur in crontab nicht

Rumak18

Member
Hallo,

ich habe mir ein Script gezaubert, das folgenden Aufbau hat:

Code:
#!/bin/bash
##### VARIABLEN #####
1_LOG_DIR=/tmp/test_log/logs1
2_LOG_DIR=/tmp/test_log/logs2
KUNDE_1=1
KUNDE_2=2
### 1 ###
for i in `dir $1_LOG_DIR`
do tar --remove-files -cvpzf $1_LOG_DIR/$i/"$i"_"$KUNDE_1"_$(date +%Y%m%d%H%M).tar.gz $1_LOG_DIR/$i/$i*.log
done
### 2 ###
for i in `dir $2_LOG_DIR`
do tar --remove-files -cvpzf $2_LOG_DIR/$i/"$i"_"$KUNDE_2"_$(date +%Y%m%d%H%M).tar.gz $2_LOG_DIR/$i/$i*.log
done

In den Verzeichnissen 1_LOG_DIR und 2_LOG_DIR befinden sich einfach nur ".log" Dateien, die ich monatlich zippen möchte. Das Script funktioniert wunderbar, wenn ich es mit ". /usr/local/bin/zip_logs.sh" starten. Trage ich es allerdings in die /etc/crontab ein, dann wird in jedem Verzeichnis ein tar.gz File erstellt, allerdings hat es keinen Inhalt.
Mein cron File sieht so aus:
Code:
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly
01 00 1 * * root /usr/local/bin/zip_logs.sh
Die Berechtigungen für die Datei sind: -rwx------ 1 root root
Eventuell sieht ja Jemand einen Fehler?
 
A

Anonymous

Gast
Rumak18 schrieb:
ich habe mir ein Script gezaubert, das folgenden Aufbau hat:

Code:
#!/bin/bash
##### VARIABLEN #####
1_LOG_DIR=/tmp/test_log/logs1
2_LOG_DIR=/tmp/test_log/logs2
KUNDE_1=1
KUNDE_2=2
### 1 ###
for i in `dir $1_LOG_DIR`
do tar --remove-files -cvpzf $1_LOG_DIR/$i/"$i"_"$KUNDE_1"_$(date +%Y%m%d%H%M).tar.gz $1_LOG_DIR/$i/$i*.log
done
### 2 ###
for i in `dir $2_LOG_DIR`
do tar --remove-files -cvpzf $2_LOG_DIR/$i/"$i"_"$KUNDE_2"_$(date +%Y%m%d%H%M).tar.gz $2_LOG_DIR/$i/$i*.log
done

Das Script funktioniert wunderbar, wenn ich es mit ". /usr/local/bin/zip_logs.sh" starten.

glaube ich nicht. Jetzt nur mal so was mir auf die Schnelle auffällt, ohne das ich das jetzt ausprobieren müsste.

#1.
1_LOG_DIR=/tmp/test_log/logs1
selbst definierte Variablen die mit einer Zahl anfangen, gibt es in der Bash nicht. Diese Zeile wird nur den Fehler "No such file or directory" oder "Command not found." erzeugen.

#2.
for i in `dir $1_LOG_DIR`
dir verwendet man besser überhaupt nicht in Scripten, und wenn denn nur als /usr/bin/dir da es es auf vielen Systemen einen Alias gleichen Namens gibt. Fröhliche Fehlersuche, auf einen solchen Fehler muss man erstmal kommen.

#3.
tar --remove-files
Wer sowas in Scipten oder cronjobs einbaut, ist selbst schuld, oder weiß genau was er da tut, und bei einem Verzeichnis mit gesetzte Sticky sind hier die Fehlermeldungen schon mal vorprogrammiert.

#4.
du erzeugst hier Ausgaben ohne Ende die du aus dem Cron als Mail zugesendet bekommst , jedoch vollkommen undokumentiert und zusammenhanglos. So ist das absolut sinnlos und einfach nur nervig

#5.
$1_LOG_DIR/$i/"$i"_"$KUNDE_1"_$(date +%Y%m%d%H%M).tar.gz $1_LOG_DIR/$i/$i*.log
mal abgesehen das selbst wenn es funktionieren würde, es beim ersten Leerzeichen im Dateinamen ausfällt, bist du dir vollkommen sicher, dass du diese "deine eigene Zeile" nach 14 Tagen noch selbst richig interpretieren könntest ?


robi
 
OP
R

Rumak18

Member
Hi,

zu #1:
Ok. Das habe ich nicht gewusst. Die Variable heißt ehrlichgesagt in Wahrheit anders, nur hat es so einen aussagekräftigen Namen, dass ich das hier im Forum nicht posten wollte. Also gehen wir davon aus, dass die Syntax hier korrekt ist bzw. keine Zahlen verwendet werden.

zu #2.
for i in `dir $1_LOG_DIR`
dir verwendet man besser überhaupt nicht in Scripten, und wenn denn nur als /usr/bin/dir da es es auf vielen Systemen einen Alias gleichen Namens gibt.
Mit /usr/bin/dir sollte es doch dann in Ordnung sein oder nicht?

zu #3:
Ich weiß ja eben was ich machen (-: Die Log Dateien werden ja auch nur dann gelöscht, wenn der Zip Vorgang erfolgreich gelaufen ist.

zu #4:
Ok. Lässt sich korrigieren.

zu #5:
Logs enthalten definitiv keien Leerdateien. Aber mal davon abgesehen... ich weiß es halt nicht besser.

Summa Summarum ergibt sich laut deinen Aussagen dann eigentlich nur die Fehlerquelle mit dem "dir" oder?
 
A

Anonymous

Gast
Rumak18 schrieb:
Summa Summarum ergibt sich laut deinen Aussagen dann eigentlich nur die Fehlerquelle mit dem "dir" oder?

Das habe ich nicht gesagt, kann ja auch niemand testen. da hier absolut unklar ist was dort für eine Verzeichnisstruktur ist und was dort für Dateien sind. prinzipell wenn die Archive angelegt werden und sie sind leer, dann gibt es "$1_LOG_DIR/$i/$i*.log" solche Dateien nicht.

duch suchst in "$1_LOG_DIR" nach Dateinamen , diese müssen Verzeichnisse sein, was passiert übrigens wenn dort auch normale Dateien sein sollten?
du suchst dann eine Ebene tiefer "$1_LOG_DIR/$i/" und dort sollen mehrere Logdateien sein die den Namen des "Verzeichnises+irgendwas+./log" tragen.
also zB
/tmp/test_log/logs1/ABC/ABC_123.log
/tmp/test_log/logs1/ABC/ABC_234.log
/tmp/test_log/logs1/ABC/ABC_345.log

diese werden dann aber bei der Bearbeiteung gelöscht, sobald sie über tar gelaufen sind, und das Ganze noch über cron und ohne Fehlerlog.
Kann niemand nachstellen ohne die Verzeichnisstruktur genau gesehen haben, und würde niemand dem ich kenne und den seine Logdateien auch nur einen Pfifferling wert sind jemals ausprobieren, geschweige denn produktiv einsetzen.

Komplizierter, umständlicher und fehleranfälliger geht es mit Sicherheit nicht. Solche Dinge erledigt normalerweise logrotate

robi
 
Was soll eigentlich die Leichenschändung? Sorry, aber nach einem Jahr kann das Thema nicht mehr von Relevanz sein.
 
Oben