Anzeige:
Ergebnis 1 bis 8 von 8

Thema: Bash Skript soll globale Variable setzen...

  1. #1
    Registrierter Benutzer
    Registriert seit
    Aug 2002
    Ort
    Berlin
    Beiträge
    77

    Bash Skript soll globale Variable setzen...

    Ich stehe vor folgendem Problem. Ich lasse ein Skript meine diversen Mailfächer kontrollieren. Um zu verhindern das der Mailserver zu oft eine Anfrage des Clients beantworten muss, habe ich eine Art Timer im Skript integriert,der sicherstellt, dass das Skript sich nur zB. alle 1000 Sekunden mit dem Server in Verbindung setzt. Die Zeit, die das Skript mindestens warten soll bis es sich wieder mit dem Server verbindet wird mit der Variable $MINTIME gesetzt.

    Mein Problem ist nun, dass ich jedesmal wenn sich das Skript mit dem Server in Verbindung setzt, einen Zeitstempel in Form einer Datei auf der Festplatte, so wie es jetzt geschieht, oder einer Variable setzten muss. Für so eine Kleinigkeit eine Datei auf die Festplatte zu schreiben ist aber eine Ressourcenverschwendung. Viel besser weäre es wenn dieser Zeitstempel in einer globalen Variable gespeichert wird. Aber anscheinend ist sowas nicht möglich :-(

    Ich fasse nochmals zusammen:

    Ich suche eine Möglichkeit wie ein Skript einen Zeitstempel in einer Variable speichert. Danach beendet sich das Skript! Nach einiger Zeit wird das Skript wieder von einem User gestattet. Nun bräuchte diese neue Instanz des Skriptes Zugriff auf den Zeitstempel der alten Instanz.

    PS: Eine Frage hätte ich noch:
    Wie kann man in einem Skript überprüfen ob eine Variable schon existiert oder nicht? Bei einer Datei weis ich das schon wie man am unten stehenden Skript ja unschwer erkennen kann ;-)

    Code:
    #!/bin/bash
    
    # ======================
    # Configuration BEGINING
    
    # 1.
    MINTIME=10
    
    # 2.
    MAILBOXFOLDERS=inbox.christoph,inbox.quartz
    
    # Configuration END
    # =================
    
    
    if [ -e ./timer.lock ]; then
    echo "timer.lock vorhanden" > /dev/null
    else
    date +%s > timer.lock
    fi
    
    # neue Zeit weniger alten
    DIFFERENCE=$[`date +%s` - `cat timer.lock`]
    
    if [ $DIFFERENCE -gt $MINTIME ]; then
    date +%s > timer.lock
    fetchmail --check --folder $MAILBOXFOLDERS > ./mailstatus
    else
    echo "Server wurde nicht neu abgefragt" # > /dev/null
    fi
    
    # Actual script for checking if there are new mails
    
    if [ $# -le 0 ]
    then
    echo "Please specify a mailbox folder."
    exit 1
    fi 
    
    ALLMAILS=$(cat ./mailstatus | grep $1 | sed -e 's/ messages (.*//')
    SEENMAILS=$(cat ./mailstatus | grep $1 | sed -e 's/.* messages (//' | sed -e 's/ seen) for .*//') 
    NEWMAILS=`expr $ALLMAILS - $SEENMAILS`
    
    if [ $NEWMAILS = - ]
    then
    echo "Error while accessing mailbox folder."
    exit 1
    fi
    
    echo $NEWMAILS

    EnnserVogt

  2. #2
    > Avatar von bash.hax0r
    Registriert seit
    Sep 2002
    Beiträge
    166
    mit
    if [ $var ]; then mach; was; fi

    werden die befehle "mach" und "was" ausgefuehrt, falls die variable $var existier...

    mit export variable=wert setzt du eine globale variable..
    Geändert von bash.hax0r (06.06.04 um 19:12 Uhr)
    To err is human; effective mayhem requires the root password!

  3. #3
    Moderator
    Registriert seit
    May 2002
    Ort
    Dortmund
    Beiträge
    1.407
    Zitat Zitat von bash.hax0r
    mit export variable=wert setzt du eine globale variable..
    Ach ja? Ist mir neu

    Harry
    Wer einen Fehler findet, der darf ihn gerne behalten ;)
    http://harry.homelinux.org - iptables Generator & mehr

  4. #4
    Moderator
    Registriert seit
    May 2002
    Ort
    Dortmund
    Beiträge
    1.407
    Zitat Zitat von ennservogt
    Ich fasse nochmals zusammen:

    Ich suche eine Möglichkeit wie ein Skript einen Zeitstempel in einer Variable speichert. Danach beendet sich das Skript! Nach einiger Zeit wird das Skript wieder von einem User gestattet. Nun bräuchte diese neue Instanz des Skriptes Zugriff auf den Zeitstempel der alten Instanz.
    Das geht eigentlich überhaupt nicht. Der Grund liegt darin, dass beim Beenden des Skripts auch die gesamte Umgebung (also auch alle Variablen in der Skriptumgebung) aufgelöst/freigegeben wird.
    Und beim Starten des nächsten Skripts wird dieses durch ein fork() der Bash(?) als Subprozess ausgeführt. Und der verschwindet ebenso wieder vollständig, wenn er abgarbeitet ist.

    PS: Eine Frage hätte ich noch:
    Wie kann man in einem Skript überprüfen ob eine Variable schon existiert oder nicht? Bei einer Datei weis ich das schon wie man am unten stehenden Skript ja unschwer erkennen kann ;-)
    Einfach mit
    Code:
    test $VARIABLE
    Der Rückgabewert (0=true, !0=false) lässt sich anschließend über die Variable $? auswerten.

    Harry
    Wer einen Fehler findet, der darf ihn gerne behalten ;)
    http://harry.homelinux.org - iptables Generator & mehr

  5. #5
    Roger Wilco
    Gast
    Zitat Zitat von bash.hax0r
    mit
    if [ $var ]; then mach; was; fi

    werden die befehle "mach" und "was" ausgefuehrt, falls die variable $var existier...

    mit export variable=wert setzt du eine globale variable..
    Da sagt http://www.tldp.org/LDP/abs/html/oth...sv.html#ENVREF aber was anderes.
    A script can export variables only to child processes, that is, only to commands or processes which that particular script initiates. A script invoked from the command line cannot export variables back to the command line environment. Child processes cannot export variables back to the parent processes that spawned them.

  6. #6
    Registrierter Benutzer
    Registriert seit
    Aug 2002
    Ort
    Berlin
    Beiträge
    77
    Hmm,
    scheint so als bleibt mir nichts anderes übrig als den Zeitstempel in einer Datei zu speichern :-(


    Da fällt mir noch was ein. Unter Gentoo werden die globalen Variablen ja von den verschiedenen Skripten aus /etc/conf.d gesetzt. Wie machen die das? Denn diese Variablen sind ja dann auch global verfügbar.


    EnnserVogt

  7. #7
    Roger Wilco
    Gast
    Zitat Zitat von ennservogt
    Da fällt mir noch was ein. Unter Gentoo werden die globalen Variablen ja von den verschiedenen Skripten aus /etc/conf.d gesetzt. Wie machen die das? Denn diese Variablen sind ja dann auch global verfügbar.
    Die Variablen in /etc/conf.d werden von den Initskripten verwendet, welche eine Instanz des jeweiligen Programms aufrufen. Die Variablen werden als im Parentprozess gesetzt (und sind damit auch in den Childprozessen verfügbar).

  8. #8
    Registrierter Benutzer
    Registriert seit
    Aug 2002
    Ort
    Berlin
    Beiträge
    77
    Danke für eure raschen Antworten, auch wenn sie leider ein wenig entäuschend sind


    EnnserVogt

Ähnliche Themen

  1. Cooles Tool für die *Konsoleros* ;)
    Von HangLoose im Forum Neue Programme/Versionen
    Antworten: 48
    Letzter Beitrag: 20.04.04, 18:44
  2. usb-festplatten
    Von w.freudenstein im Forum Linux Allgemein
    Antworten: 11
    Letzter Beitrag: 10.02.04, 20:27
  3. wine kompiliere probleme
    Von ml im Forum Virtuelle Maschinen und Emulatoren
    Antworten: 0
    Letzter Beitrag: 23.01.04, 19:21
  4. need help bei linux u. 3d
    Von mexx im Forum X-Konfiguration
    Antworten: 16
    Letzter Beitrag: 24.07.03, 21:30
  5. Nächstes Problem mit Transcode
    Von shanti im Forum Kompilieren von Kernel und Sourcen
    Antworten: 4
    Letzter Beitrag: 28.04.02, 01:57

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •