Script durch Script starten lassen

Dieses Thema im Forum "Shell-Skripte" wurde erstellt von xeeen, 11.07.2007.

  1. xeeen

    xeeen Mitglied

    Dabei seit:
    24.04.2007
    Beiträge:
    32
    Zustimmungen:
    0
    Hallo Community,

    ich würde gerne ein kleines Script haben, welches ein anderes Shell Script genau dann startet, wenn ein Verzeichniss eine gewisse Größe übersteigt.

    Ein Shell Script ließt die Anzahl der Dateien einens Verzeichnisses und prüft den Platz, den diese dort verbrauchen. Die Ausgaben werden direkt in eine log geschrieben, sodass ich das überprüfen kann.

    Wenn die Ausgabe von
    Code:
    du -h
    nun beispielsweise 2 GB übersteigt, soll ein Script gestartet werden, welches das Verzeichnis bereinigt. Dieses habe ich ebenfalls schon fertig.

    Mir geht es also rein um die Anweisung in meinem ersten Prüfscript.

    Hat jemand einen Tipp?
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. #2 kames, 11.07.2007
    Zuletzt bearbeitet: 11.07.2007
    kames

    kames Eroberer

    Dabei seit:
    11.07.2007
    Beiträge:
    67
    Zustimmungen:
    0
    Ort:
    NRW
    Ich würde das mit find machen ..... :- )


    Also quasi so .. Ist aus dem Kopf bitte nochmal mit man find nachlesen.

    find . -size G1 -exec rm {} \;

    find . sucht im aktuelle Verzeichnis kann also auch /tmp oder so sein
    G1 sag datei die 1GB groß ist
    rm ist der Befehl
    {} auf die gefundene Datei

    Denke das ist besser als du -h
     
  4. xeeen

    xeeen Mitglied

    Dabei seit:
    24.04.2007
    Beiträge:
    32
    Zustimmungen:
    0
    Hi und danke für die fixe Antwort.

    Aber es geht ja darum, dass in dem Verzeichnis einzelne Dateien sind, und wenn das gesamte Verzeichnis eine Größe von über 2 GB hat, dann sollen alle darin befindlichen Datei gelöscht werden. Das Script hierzu habe ich bereits.

    Ich möchte also wissen, wie ich das erste Script (das prüft, wie viel Pltz belegt ist) anweisen kann, bei Bedarf ein zweites auszuführen.
     
  5. kames

    kames Eroberer

    Dabei seit:
    11.07.2007
    Beiträge:
    67
    Zustimmungen:
    0
    Ort:
    NRW
    Dann mach es doch so.

    Dein Script muss prüfen ob Verzeichnis > 2GB ist .. wenn ja leg ne neue Datei an

    z.B. touch /tmp/ja

    wenn nein rm /tmp/ja

    Dann noch diese Zeile rein ...


    if [ -f /tmp/ja ]; then
    /start_script2.sh
    fi
     
  6. #5 serverzeit.de, 11.07.2007
    serverzeit.de

    serverzeit.de Netzwerkarchäologe

    Dabei seit:
    24.05.2007
    Beiträge:
    227
    Zustimmungen:
    0
    Ordnergröße stellst du mit du -sch <Ordnername> fest. Die Ausgabe kannst du dann mit einer regex auswerten und brauchst nicht irgendwelche Dateien schreiben und löschen.
     
  7. kames

    kames Eroberer

    Dabei seit:
    11.07.2007
    Beiträge:
    67
    Zustimmungen:
    0
    Ort:
    NRW
    Natürlich geht es auch mit Variablen.

    Vorteil man braucht nur ein Script.

    Ich hatte das auch so versandten das du die Script zur unterschiedlichen Zeiten laufen
    lassen wolltest.

    Da würde ich mit der Datei arbeiten. Evtl. sogar mit Logfiles, damit ich weiss was gelöscht würde bzw. wann.
     
  8. xeeen

    xeeen Mitglied

    Dabei seit:
    24.04.2007
    Beiträge:
    32
    Zustimmungen:
    0
    Wie prüfe ich, ob das Verzeichnis 2 GB oder größer ist?

    Mein lächerlicher Ansatz mit if /verzeichnis >= 2G scheitert mit der Bemerkung
    /verzeichnis is a directory.

    ....
     
  9. kames

    kames Eroberer

    Dabei seit:
    11.07.2007
    Beiträge:
    67
    Zustimmungen:
    0
    Ort:
    NRW
    Mit einen Script :


    #!bin/bash
    A=`du -sc /tmp`;


    echo $A | { read ZWEI muell ;

    if [ $ZWEI -gt 999999 ]
    then
    echo "Hier soll gelöscht werden"
    fi
    }
     
  10. #9 David_1980, 11.07.2007
    Zuletzt bearbeitet: 17.07.2007
    David_1980

    David_1980 Jungspund

    Dabei seit:
    28.06.2007
    Beiträge:
    11
    Zustimmungen:
    0
    Ort:
    Hannover
    Oder Du machst es so:

    Code:
    #!/bin/bash
    #
    # Dieses Skript berechnet die Groesse eines Verzeichnisses und führt je nach
    # Verzeichnisgroesse einen anderen Anweisungsblock aus.
    #
    # Einfach die Variable $dir aendern, dann funktioniert das Skript auch für
    # andere Verzeichnisse.
    #
    # Mit der Variablen $threshold wird der Grenzwert für den if-Block bestimmt.
    #
    # Die Variable $unit gibt die Einheit an. Mögliche Werte sind b für Byte, k
    # für Kilobyte und m für Megabyte.
    #
    # Getestet auf einer deutschen Version von Ubuntu 7.04. Bei einem OS in einer
    # anderen Sprache muss zumindest das Wort "insgesamt" in dem ersten regulären
    # Ausdruck angepasst werden!
    #
    
    dir="/home/david";
    threshold=2000;
    unit="m"; # b, k, or m
    
    dirSize=`du -sc$unit $dir | egrep "^[[:digit:]]+[[:space:]]+insgesamt$" | egrep -o "[[:digit:]]+"`;
    echo
    echo "Verzeichnis: $dir";
    echo "Verzeichnisgroesse: $dirSize$unit";
    if [ $dirSize -ge $threshold ]; then
      echo "Das Verzeichnis belegt mindestens $threshold$unit"
    else
      echo "Das Verzeichnis belegt weniger als $threshold$unit"
    fi
    echo "Ende";
    echo
    Erzeugt bei mir folgende Ausgabe:
    Code:
    Verzeichnis: /home/david
    Verzeichnisgroesse: 47m
    Das Verzeichnis belegt weniger als 2000m
    Ende
     
  11. #10 Wolfgang, 12.07.2007
    Wolfgang

    Wolfgang Foren Gott

    Dabei seit:
    24.04.2005
    Beiträge:
    3.978
    Zustimmungen:
    0
    Ort:
    Erfurt
    Warum so umständlich?
    Wenn du 1kb=1024 Byte als Grundlage nimmst:
    Code:
    echo " 2 GB entsprechen 2147483648 Byte"
    LIM=2147483648;
    FSZ="$(du -s /path|cut -f1)"
    if [ $FSZ -gt $LIM ];
    then
    # hier was du machen willst
    fi
    
    Gruß Wolfgang
     
  12. #11 David_1980, 12.07.2007
    David_1980

    David_1980 Jungspund

    Dabei seit:
    28.06.2007
    Beiträge:
    11
    Zustimmungen:
    0
    Ort:
    Hannover
    LOL

    Ich kannte cut noch nicht. Vielen Dank Wolfgang!

    Aber ich würde es trotzdem so machen:
    Code:
    #!/bin/bash
    #
    # Dieses Skript berechnet die Groesse eines Verzeichnisses
    # und führt je nach Verzeichnisgroesse einen anderen
    # Anweisungsblock aus.
    #
    # Einfach die Variable $dir aendern, dann funktioniert das
    # Skript auch für andere Verzeichnisse.
    #
    # Mit der Variablen $threshold wird der Grenzwert für den
    # if-Block bestimmt.
    #
    # Die Variable $unit gibt die Einheit an. Mögliche Werte
    # sind b für Byte, k für Kilobyte und m für Megabyte.
    #
    
    dir="/home/david";
    threshold=2000;
    unit="m"; # b, k, or m
    
    dirSize=`du -s$unit $dir | cut -f1`;
    echo
    echo "Verzeichnis: $dir";
    echo "Verzeichnisgroesse: $dirSize$unit";
    if [ $dirSize -ge $threshold ]; then
      echo "Das Verzeichnis belegt mindestens $threshold$unit"
    else
      echo "Das Verzeichnis belegt weniger als $threshold$unit"
    fi
    echo "Ende";
    echo
    Habe die Zeile mit dem regulären Ausdruck an Deinen Vorschlag angepasst. Aber die Möglichkeit zwischen den Einheiten MB, KB und Byte zu wählen, finde ich eigentlich ganz nett. Und mit den 3 Variablen zu Beginn des Skriptes kann man das Skript rasch an eigene Bedürfnisse anpassen. Bläht das ganze zwar etwas auf, aber wer keinen Wert auf Dokumentation und Wiederverwendbarkeit legt, der kann es ja ungefähr so zusammenkürzen:
    Code:
    if [ `du -sm ~ | cut -f1` -ge 2000 ]; then
      echo "Das Verzeichnis belegt mindestens 2000 MB"
    else
      echo "Das Verzeichnis belegt weniger als 2000 MB"
    fi
    
     
  13. #12 lolomat, 16.07.2007
    Zuletzt bearbeitet: 16.07.2007
    lolomat

    lolomat b00n

    Dabei seit:
    05.12.2006
    Beiträge:
    23
    Zustimmungen:
    0
    Ich bewege mich in die gleiche Richtung und wollte, desswegen kein neuen Thread öffnen.

    Um was gehts?
    Ich möchte mit dem Script (check_beat) überprüfen, ob das Script (heartbeat) noch am laufen ist - wenn nicht, dann soll es das Script starten.

    Script: check_beat
    Code:
    #!/bin/bash
    
    TEST=$(/bin/ps ax | /bin/grep heartbeat | /bin/grep -v ps | /bin/wc -l)
    
    if [ $TEST -gt 1 ];
    then
        echo "No Problems!"
    else
        echo "Dead :("
        ./home/controller/heartbeat
    fi
    
    Script: heartbeat
    Code:
    #!/bin/sh
    #*
    #* File         :       Ping Check
    #* Description  :       Check list ot hosts if they are responding to ping
    #* Author       :       Luc I. Suryo (luc at suryo.com)
    #* Version      :       1.0
    #* Date         :       Jan 17, 2003
    #* History      :       First release
    #*
    
    FROMMAIL="root@mv3.humiliation.com"
    TOMAIL="administrator@humiliation.com"
    MAILFILE=/tmp/`basename ${0}`.$$
    
    HOSTLIST="bk1"
    PROBLIST=""
    
    SentPage() {
    
            DATE=`date "+%H:%m %d-%m%Y"`
            HOST=`uname -n`
    
            echo "From: ${FROMMAIL}"                                > ${MAILFILE}
            echo "To: ${TOMAIL}"                                    >> ${MAILFILE}
            echo "Subject: HOST DOWN ALERT FROM: ${HOST}."        >> ${MAILFILE}
            echo "Content-Type: text/plain; charset=us-ascii"       >> ${MAILFILE}
            echo "Content-Transfer-Encoding: 7bit\n\n"              >> ${MAILFILE}
    
            echo " "                                                >> ${MAILFILE}
            echo "Time stamp: ${DATE}."                             >> ${MAILFILE}
            echo " "                                                >> ${MAILFILE}
    
            echo "Following host(s) has problems:"                  >> ${MAILFILE}
            echo ${PROBLIST}                                        >> ${MAILFILE}
    
            echo " "                                                >> ${MAILFILE}
            echo "-----------"                                      >> ${MAILFILE}
    
            /usr/lib/sendmail -oi -t -oem < ${MAILFILE}
            rm -f ${MAILFILE}
    }
    
    CheckHosts() {
    
            for hst in `echo ${HOSTLIST}`
            do
                    /bin/ping -t 1 $hst 1 1  > /dev/null 2>&1
                    if [ $? -ne 0 ] ; then
                            PROBLIST="${PROBLIST} ${hst}"
                    fi
            done
    }
    
    main() {
    
            CheckHosts
    
            if [ "${PROBLIST}" != "" ] ; then
                    SentPage
            fi
    }
    
    main
    
    Da die Funktion CheckHosts eine loop-Schlaufe ist, läuft das Script weiter bis der Ping nicht mehr erfolgreich ist.

    Das Problem
    Beim Ausführen von ./home/controller/heartbeat (check_beat) wartet das Script bis der "Befehl" beendet wurde - dies kann beim heartbeat-Script lange dauern.
    Wie kann ich im check_beat-Script das heartbeat-Script ausführen und danach chck_beat beenden ohne dadurch das heartbeat-Script zu beenden?
     
  14. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  15. #13 serverzeit.de, 16.07.2007
    serverzeit.de

    serverzeit.de Netzwerkarchäologe

    Dabei seit:
    24.05.2007
    Beiträge:
    227
    Zustimmungen:
    0
    Warum so umständlich? Hast du dir mal das Tool "monit" angeschaut? Das macht genau das und noch viel mehr.

    Solange bei dem zu prüfenden Dienst ein PID-File erstellt wird, sollte monit genau das sein was du suchst.
     
  16. #14 lolomat, 16.07.2007
    lolomat

    lolomat b00n

    Dabei seit:
    05.12.2006
    Beiträge:
    23
    Zustimmungen:
    0
    Perfekt!
    Das Tool monit war mir bisher nicht bekannt.
    Vielen Dank für den Tipp.
     
Thema:

Script durch Script starten lassen

Die Seite wird geladen...

Script durch Script starten lassen - Ähnliche Themen

  1. Script Datumsproblem Variablen durcheinander??

    Script Datumsproblem Variablen durcheinander??: Hallo zusammen habe ein kleines Backupsript welches täglich nachts um 23.50 Uhr einge Dump erstellt und per sftp auf einen Sicherungsserver...
  2. configure script durchlaufen lassen

    configure script durchlaufen lassen: hi all, ich mal eine frage zum compilieren. ich benötige eine aufwandsschätzung für die installation von subversion 1.5. um abzuschätzen wie...
  3. Massenänderung von Passwörtern durch ein Script ?

    Massenänderung von Passwörtern durch ein Script ?: Hallo Leute Ich habe folgendes Problem: Ich habe insgesammt 9 Systemuser, bei denen ich alle 2 Wochen das Passwort ändern möchte. Da ich zu...
  4. Textdokument durch Script ändern!

    Textdokument durch Script ändern!: Hi! Gibts eine Möglichkeit damit ich mit einem Script eine beliebige Zeile (muss nur eine Zeile sein) ändere?? Ich habe es mir so vorgestellt:...
  5. Bräuchte Hilfe bei Backupscript mittels Bash und cronjob

    Bräuchte Hilfe bei Backupscript mittels Bash und cronjob: Es soll für bestimmte Ordner Archivierung aller Dateien(Logfiles), die älter als 30 Tage sind machen. Am besten einmal täglich nachts irgendwann....