[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Umgebungsvariable bei über Cronjob gestartetem Shellscript nutzen



Sorry, habe die Antwort heut nachmittag schon geschrieben,
aber vergessen sie abzuschicken. Mittlerweile hast Du ja schon
eine Antwort erhalten... Ich schick sie trotzdem noch ;)

Michael Achtzehn schrieb:
> Hallo,
> ich möchte bei einem Überwachungsscript das alle 5 min über crontab 
> gestartet wird und das im Fehlerfall eine Mail versendet, verhindern das 
> die Mail mehr als einmal gesendet wird. Dazu setze ich eine Variable 
> norepeat nach dem ersten Auftreten des Fehlers (export norepeat="1") - 
> die beim nächsten Lauf des Scripts ausgewertet wird und ein mehrfaches
Nutzlos, da cron jedesmal einen neuen Prozess startet.
Versuch doch mal:
*/1 * * * * root env; export CVtest="On"; env;
In /etc/crontab
In den Mails kannst Du sehen: CVTest ist nicht vorhanden.

> Versenden der Mail verhindern soll. Nachdem ich herausgefunden habe, 
> dass man das Script mit source ... starten muss, damit es  in der 
> aktuellen Shell läuft, funktioniert es bei manuellem  Start auch.
> Auch in der Crontab starte ich das Script nun mit source /Pfad zum 
> Script/script.sh. Hier ist die Variable beim nächsten Lauf nicht 
> verfügbar. Inzwischen habe ich auch gelernt das es bei Corn keine 
> Umgebung gibt - deshalb habe ich oben ins Script (unter der Zeile #! 
> /bin/bash) folgende Zeilen eingetragen (wurde in einigen Foren empfohlen).
> . /etc/profile
> . ~/.profile
Das ist absoluter Quatsch, aus gutem Grund hat cron eine sehr
eingeschränkte Umgebung und es hilft hier auch nix.

> Leider funktioniert es immer noch nicht - beim wiederholten Lauf des 
> Scripts ist die Umgebungsvariable nicht definiert.
> 
> Wie kann ich das Problem lösen (ich möchte möglichst keine Datei zum 
> zwischenspeichern des Wertes nutzen)?

Doch, eine Datei anlegen, z.B. in /var/run und auf deren Existenz
prüfen.

> Warum funktioniert das mit dem Vorgeben der Profile oben im Script nicht 
> - obwohl andere User (mit anderen Linuxen) damit Erfolg hatten?

hmmm, glaub ich nicht.

> Was ist eurer Meinung nach die eleganteste Methode Variablen über die 
> Laufzeit eines Scripts hinaus "aufzubewahren"?

Einen eigenen 'Dämon' erstellen? In etwa so (ungetestet):
--8<--script checkit------
#!/bin/bash
trap "rm -f /var/run/checkit; exit" 2 3 4 5 6 7 10 11 12 13 14 15
if ps au | grep $0 >/dev/null 2>&1 ; then
  echo "$0 ist schon gestartet."
  exit 1
else
  echo $$ >/var/run/checkit
fi
nomsg=0
while true ; do
  [...]
  if <Fehler> ; then
    if [ $nomsg -ne 1 ] ; then
      <sende Fehlernachricht>
      [...]
    fi
    nomsg=1
  else
    nomsg=0
  fi
  [...]
  sleep 300
done
rm -f /var/run/checkit
exit
--8<---------------------
Und in /etc/init.d ein startscript anlegen, in dem checkit im
Hintergrund gestartet wird:
--8<---------------------
[...]
start() {
 echo "Starte checkit"
 checkit &
}
stop() {
 echo "checkit wird beendet"
 kill `cat /var/run/checkit`
}
case $1 in
  start) start
  ;;
  stop)  stop
  ;;
  restart) stop; start;
  ;;
  *) echo -e "Parameter fehlt!\nAufruf: $0 start|stop|restart"
  ;;
esac
[...]
--8<---------------------

dann noch nach /etc/rcX.d verlinken...


-- 
Gruss
  Bernd



Reply to: