Shell script, wo ist der Fehler ?

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Totta123
Beiträge: 77
Registriert: 09.10.2002 20:07:02

Shell script, wo ist der Fehler ?

Beitrag von Totta123 » 01.02.2010 15:52:57

Hallo, ich hab ein kleines Problem. Ich möchte eine Datei überwachen. Wenn die Datei 10min nicht modfied ist möchte ich das eine mail raus geht.

Hier das Script:
#!/bin/sh
# check timestamp zabbix logfile, it should be modified in the past 10 minutes
RESULT='find /var/log/zabbix-server/zabbix_server.log -mmin -10'
RESULT=$?
# if RESULT = 0 -> OK
# RESULT = 1 -> file not found
if [ $RESULT != 0 ]; then
echo "TESTt" | /usr/bin/mail -s "$HOSTNAME not responding for 10 minutes" mail@domain.com
fi
exit 0
Wenn ich den mailing befehl von der console aus setze, dann bekomme ich eine Mail. Aber nicht aus dem Script heraus. Das problem ist auch das ich als result IMMER "0" zurückbekomme obwohl die Datei schon seit über 10 min nicht mehr angefasst und modifiziert wurde.
console:#RESULT='find /var/log/zabbix-server/zabbix_server.log -mmin -10'
console:#RESULT=$?
console:#echo $RESULT
0
console:#
Habe ich einen Fehler im Script?

bin über jeden Tippp dankbar, bzw. nehme ich auch andere Lösungsvorschläge an. ;)

Gruss

uname
Beiträge: 12423
Registriert: 03.06.2008 09:33:02

Re: Shell script, wo ist der Fehler ?

Beitrag von uname » 01.02.2010 16:20:26

Code: Alles auswählen

if [ $RESULT != 0 ]; then
Lese

Code: Alles auswählen

man test
Damit werden Strings verglichen. Vielleicht eher so:

Code: Alles auswählen

if [ -n $RESULT ]; then
Nicht probiert.

123456
Beiträge: 6126
Registriert: 08.03.2003 14:07:24

Re: Shell script, wo ist der Fehler ?

Beitrag von 123456 » 01.02.2010 16:22:28

klar das ergibt beides mal 0.

vielleicht so:

Code: Alles auswählen

#!/bin/sh
RESULT=$(find /var/log/zabbix-server/zabbix_server.log -mmin -10)
if [ $RESULT ]; then
  echo "TESTt" | /usr/bin/mail -s "$HOSTNAME not responding for 10 minutes" mail@domain.com
fi
exit 0
EDIT:
hab mal die falschen Ticks (Single Quotes) wegretuschiert. ;)
Zuletzt geändert von 123456 am 01.02.2010 18:26:38, insgesamt 2-mal geändert.

Benutzeravatar
Meillo
Moderator
Beiträge: 9254
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Shell script, wo ist der Fehler ?

Beitrag von Meillo » 01.02.2010 17:58:08

Entweder Backticks (statt Single Quotes) verwenden, oder mit $? arbeiten.
Use ed once in a while!

Totta123
Beiträge: 77
Registriert: 09.10.2002 20:07:02

Re: Shell script, wo ist der Fehler ?

Beitrag von Totta123 » 01.02.2010 20:02:35

Danke für die bisherigen Antworten. Bisher hat aber irgendwie leider noch nichts von geholfen.
Da ich aber nicht so der grosse shell scripter bin kann der Fehler auch bei mir liegen.

@Meilo
Kannst du das nochmal näher erläutern? Ich weiss nicht genau wie ich anfangen soll bzw. was du meinst.

Danke

EDIT: Ich muss den code morgen von ub13 nochmal testen, du hast ja nochwas angepasst das hab ich jetzt erst gesehen.

Benutzeravatar
Meillo
Moderator
Beiträge: 9254
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Shell script, wo ist der Fehler ?

Beitrag von Meillo » 01.02.2010 23:27:40

Totta123 hat geschrieben: @MeiLlo
Kannst du das nochmal näher erläutern? Ich weiss nicht genau wie ich anfangen soll bzw. was du meinst.
Ich gehe den Code mal durch:

Code: Alles auswählen

RESULT='find /var/log/zabbix-server/zabbix_server.log -mmin -10'
Du speicherst in RESULT einen String der wie eine Befehlszeile aussieht.

Code: Alles auswählen

RESULT=$?
Du speicherst in RESULT (d.h. du überschreibst den vorigen Wert. D.h. die vorige Zeile macht gar nichts) den Return-Code der letzten Anweisung. Ich weiß nicht auswenig ob Variablenzuweisungen einen Return-Code liefern, oder ob sie jemals fehlschlagen.

Code: Alles auswählen

# if RESULT = 0 -> OK
# RESULT = 1 -> file not found
Falsch. RESULT hält (vermutlich) den Wert der Variablenzuweisung. Jedenfalls *nicht* den Return-Code des find-Kommandos, denn das wird *nie* ausgeführt -- es ist nur ein String.

Code: Alles auswählen

if [ $RESULT != 0 ]; then
Numerische Werte vergleicht man mit -eq und -ne. = und != ist ein String-Vergleich ... was in diesem Fall gut gehen *kann*. Aber dann sollte die Null in Anführungszeichen gesetzt sein.

Code: Alles auswählen

echo "TESTt" | /usr/bin/mail -s "$HOSTNAME not responding for 10 minutes" mail@domain.com
fi
exit 0
Das sieht gut aus.
Wenn ich den mailing befehl von der console aus setze, dann bekomme ich eine Mail. Aber nicht aus dem Script heraus. Das problem ist auch das ich als result IMMER "0" zurückbekomme obwohl die Datei schon seit über 10 min nicht mehr angefasst und modifiziert wurde.
Eben weil der find-Befehl nie ausgeführt wird.

Code: Alles auswählen

RESULT='find /var/log/zabbix-server/zabbix_server.log -mmin -10'
Das ist der Knackpunkt. Du musst verstehen was hier passiert, und was nicht passiert, und warum das nicht das ist was du willst. Erklär's einem Kuscheltier (Das ist ernst gemeint!) dann wirst du vermutlich selbst drauf kommen.
Use ed once in a while!

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Re: Shell script, wo ist der Fehler ?

Beitrag von Duff » 02.02.2010 07:57:07

Zudem wird in der Variablen RESULT die Liste vom find-Kommando gespeichert.
Oh, yeah!

Totta123
Beiträge: 77
Registriert: 09.10.2002 20:07:02

Re: Shell script, wo ist der Fehler ?

Beitrag von Totta123 » 02.02.2010 10:00:00

Hmmm also der code von ub13 scheint in gewisser Weise zu funktionieren. Aber nun bekomme ich alle 10min eine mail, obwohl die Datei schon wieder aktualisiert wurde. Wenn ich den find Befehl auf der Console ausführe, dann gibt er mir als Wert auch immer die datei zurück.

Der FIND befehl ist doch richtig, mit "-mmin -10" sag ich ihm doch das er mir die datei ausgeben soll, die seit 10min nicht mehr gefüllt / modifiziert wurde oder?

Benutzeravatar
Meillo
Moderator
Beiträge: 9254
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Shell script, wo ist der Fehler ?

Beitrag von Meillo » 02.02.2010 10:05:38

Duff hat geschrieben:Zudem wird in der Variablen RESULT die Liste vom find-Kommando gespeichert.
Genau. Für eigene Scripte Variablennamen mit Kleinbuchstaben wählen.

Nur weil die vom System vorgegebenen Variablen in der Shell aus Großbuchstaben bestehen, denken alle Shellscripting-Beginner, dass alle Variablen aus Großbuchstaben bestehen müssten.
Use ed once in a while!

123456
Beiträge: 6126
Registriert: 08.03.2003 14:07:24

Re: Shell script, wo ist der Fehler ?

Beitrag von 123456 » 02.02.2010 10:12:10

Duff hat geschrieben:Zudem wird in der Variablen RESULT die Liste vom find-Kommando gespeichert.
welche Liste? da wird nur eine Datei abgefragt.

123456
Beiträge: 6126
Registriert: 08.03.2003 14:07:24

Re: Shell script, wo ist der Fehler ?

Beitrag von 123456 » 02.02.2010 10:21:54

Totta123 hat geschrieben:Der FIND befehl ist doch richtig, mit "-mmin -10" sag ich ihm doch das er mir die datei ausgeben soll, die seit 10min nicht mehr gefüllt / modifiziert wurde oder?
So verstehe ich die man page auch. Du kannst mal zusätzlich in die if Schleife ein "touch -m /var/log/zabbix-server/zabbix_server.log" einbauen. Dann wird die Modifcation Time direkt wieder geändert.

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Re: Shell script, wo ist der Fehler ?

Beitrag von Duff » 02.02.2010 10:26:07

ub13 hat geschrieben:
Duff hat geschrieben:Zudem wird in der Variablen RESULT die Liste vom find-Kommando gespeichert.
welche Liste? da wird nur eine Datei abgefragt.
Ups, sorry. Du hast natürlich Recht. Hatte den Befehl auf ein Verzeichnis angewendet, so dass mehrere Dateien als Resultat zurück geliefert werden können.
Oh, yeah!

Totta123
Beiträge: 77
Registriert: 09.10.2002 20:07:02

Re: Shell script, wo ist der Fehler ?

Beitrag von Totta123 » 02.02.2010 10:43:31

Hmmm ich schnall es nicht. Das Script sieht nun folgendermassen aus:

Code: Alles auswählen

#!/bin/sh
# check timestamp zabbix logfile, it should be modified in the past 10 minutes

result=$(find /var/log/zabbix-server/zabbix_server.log -mmin -10)
if [ $result ]; then
touch -m "/var/log/zabbix-server/zabbix_server.log" | echo "Zabbix Server Error" | /usr/bin/mail -s "$HOSTNAME PROBLEM " mail@domain.com
fi
exit 0
Er passt dann auch die Datei an mit dem neuen Timestamp an, wenn ich aber direkt danach den Find befehl ausführe, bekomme ich immer noch als Ausgabe die zabbix_server.log datei.... irgendwas kann da ja mit dem find befehl nicht richtig sein.... noch jemand eine idee ?

123456
Beiträge: 6126
Registriert: 08.03.2003 14:07:24

Re: Shell script, wo ist der Fehler ?

Beitrag von 123456 » 02.02.2010 11:25:04

2 Dinge:
was soll das mit den Pipes?
wozu "-10" als Zeitparameter - die manpage redet von "-mmin n" und nicht "-mmin -n"?

Totta123
Beiträge: 77
Registriert: 09.10.2002 20:07:02

Re: Shell script, wo ist der Fehler ?

Beitrag von Totta123 » 02.02.2010 11:46:11

Wie mach ich es denn ohne pipes? Also mehrere Argumente ausführen? Aber davon mal abgesehen funktioniert das ja.

In der manpage von find steht auch folgendes:

Numeric arguments can be specified as
+n for greater than n,
-n for less than n,
n for exactly n.

daher das -

EDIT: Vielleicht sollte ich mal ein + probieren ;)) Es wurde dann ja seit mehr als 10 min nicht mehr bearbeitet.... argh

123456
Beiträge: 6126
Registriert: 08.03.2003 14:07:24

Re: Shell script, wo ist der Fehler ?

Beitrag von 123456 » 02.02.2010 11:55:07

na so:

Code: Alles auswählen

#!/bin/sh
# check timestamp zabbix logfile, it should be modified in the past 10 minutes

result=$(find /var/log/zabbix-server/zabbix_server.log -mmin +10)
if [ $result ]; then
   touch -m "/var/log/zabbix-server/zabbix_server.log" 
   echo "Zabbix Server Error" | /usr/bin/mail -s "$HOSTNAME PROBLEM " mail@domain.com
fi
exit 0

bluesmiller
Beiträge: 4
Registriert: 08.04.2010 13:35:55
Wohnort: Karlsruhe

Re: Shell script, wo ist der Fehler ?

Beitrag von bluesmiller » 21.04.2010 11:24:11

Code: Alles auswählen

#!/bin/sh
file=$1;
let time=$(date '+%s')-$(date -r $1 '+%s');
if [ $time -gt 600 ]; then
    echo "Action!"
fi
Für sekundengenaue Anwendungen 8)

Antworten