Fehlerbehandlung in Sätzen [Shell Script]

564
Adryoid

Ich habe dieses Setup und brauche, wenn im Hauptskript ein Fehler aufgetreten ist. Um diesen Fehler in eine temporäre $ INFO_PLUGIN-Datei zu übertragen, besteht das Problem darin, dass das Skript weiterarbeitet caseund auch eine OK-Nachricht an die temporäre $ INFO_PLUGIN-Datei gesendet wird, die den vorhandenen Fehler überschreibt Botschaft.

Ich würde gerne, wenn ein Fehler auftritt, diesen Fehler in die $ INFO_PLUGIN-Temp-Datei übernehmen und die Ausführung reportmail OK;auf irgendeine Weise verhindern, aber ich weiß nicht wie und ich brauche Hilfe.

Thnaks im Voraus für Ihre Zeit und Zusammenarbeit.

Hauptskript:

source ~/share/mailReport.fn  case $2 in firstcase) ssh -q -n loguser@server "mkdir -p /home/loguser/logstorage"  if [[ $? -ne 0 ]]; then echo " ************ " echo " * Error * " echo " ************ " reportmail 12; exit 12; fi; ;; secondcase) startDate=`date +%s` if [ -z $3 ]; then echo -e "\nInsert a parameter...: $0 $1 $2 [Here!]\n" exit; fi; echo -e "\nRunning test with error number...: $3\n" endDate=`date +%s` DIFF=$(( $endDate - $startDate )) echo -e "* Time in sec..: $DIFF\n" reportmail $3; ;; esac echo " ************ " echo " * Finished * " echo " ************ "  reportmail OK; 

reportMail.sh-Skript:

case $1 in 12) mailx -s "Error happened during mkdir" -r $SENDER_ADDRESS $RECIPIENT_ADDRESS <<EOF Hello, Error happened in `uname -n` bla, bla, bla... EOF echo -e "CRITICAL - Error creating destination dir" > $INFO_PLUGIN ;; OK) echo -e "OK - Time in sec..: $DIFF Total Saved..: `cat $temp` MB" > $INFO_PLUGIN rm $temp ;; esac 

Bearbeiten:

############################### Little example ############################### 

test.sh

#!/bin/sh  source ~/test2.sh  case $1 in  a) error 0; ;; b) error 1; ;; c) error 2; ;;  esac;  error 0; # This is what I need to jump in case of error 

test2.sh:

#!/bin/sh  function error () {  case $1 in  0) echo "Everything = OK" > ~/results.txt ;; 1) echo "Sth Wrong = error 2" > ~/results.txt ;; 2) echo "Sth Wrong = error 3" > ~/results.txt ;;  esac; } 

wenn ich renne:

[user@server dir]$ ./Test.sh 1 

oder:

[user@server dir]$ ./Test.sh 2 

Dies ist das Ergebnis, das in der Datei ~ / results.txt enthalten ist

[user@server dir]$ cat results.txt Everything = OK 

Das Ergebnis ist in allen Fällen dasselbe, denn error 0;beim ersten Skript lautet meine Frage, wie ich feststellen kann, ob bei einem Wert zuerst ein Fehler aufgetreten ist case, zum Beispiel: Fehler beim Ausführen Test.sh b. Wie kann ich springen error 0;und verhindern, dass es ausgeführt wird, wenn zuvor ein Fehler aufgetreten ist, andernfalls, wenn kein Fehler vorliegt case. error 0;sollte ausgeführt werden, um zu sagenhey, everything is ok!

Ich hoffe, Sie verstehen und vielen Dank für Ihre Zeit.

1
Hallo und herzlich willkommen bei SuperUser! Sie werden wahrscheinlich feststellen, dass es einfacher ist, Antworten auf solche Fragen zu erhalten, wenn Sie ein minimales Codebeispiel mit unerwartetem Verhalten erstellen können. l0b0 vor 10 Jahren 0
In `test.sh` geben Sie an:` error 0; # Dies ist, was ich im Fehlerfall springen muss. Also, ist deine Frage: Wie bekomme ich einen Standardzweig in `case ... esac`? Wenn ja, ist die Antwort, als letzten Fall "*)" zu verwenden. mpy vor 10 Jahren 0
Meine Frage ist: Wenn ich das erste Skript ausführte und kein Fehler aufgetreten ist, wird am Ende des Skripts `error 0;` ausgeführt und eine OK-Nachricht an die Datei results.txt gesendet. Andernfalls, falls ein Fehler aufgetreten ist, wird die ERROR-Nachricht vom seconf-Skript an results.txt gesendet, jedoch nur für eine Sekunde, bis das erste Skript noch einmal "error 0;" ausgeführt wird und die ERROR-Nachricht in results.txt überschreibt. Adryoid vor 10 Jahren 0

1 Antwort auf die Frage

0
Adryoid

Problem gelöst, indem Sie Folgendes hinzufügen:

echo -e "CRITICAL - Error deleting files - Performance" > $INFO_PLUGIN && echo "1" > $err 

Senden Sie diese 1an eine Fehlerdatei und ...

if [ `cat $err` -eq 1 ]; then reportmail 201$BYTES; rm $err else reportmail 201$BYTES; reportmail OK; rm $err fi; 

Dieser Test prüft, ob während der Ausführung von Skripts ein Fehler aufgetreten ist. Wenn ja, senden Sie den Bericht in ordr, um das Protokoll auf einem Webserver anzuzeigen. Andernfalls senden Sie das Protokoll an einen Webserver und senden die Nachricht OK an die Nagios-Überwachung System.

Vielen Dank! & bis zum nächsten Mal!