Script durch Script starten lassen

X

xeeen

Mitglied
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?
 
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
 
Zuletzt bearbeitet:
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.
 
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
 
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.
 
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.
 
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.

....
 
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
}
 
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
 
Zuletzt bearbeitet:
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
 
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
 
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?
 
Zuletzt bearbeitet:
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.
 
Perfekt!
Das Tool monit war mir bisher nicht bekannt.
Vielen Dank für den Tipp.
 

Ähnliche Themen

[HowTo] TeamSpeak 2 - RC2 - Server (Deutsch/Englisch)

Zurück
Oben