Fotowoche KW16: the park

Ich war vorige Woche wiedermal mit meinem geschätzten Arbeitskollegen unterwegs fotografieren, dermal im Schlosspark Schönbrunn.

\o/ Foto! Nein Fotos! Und das sogar am Mittwoch!

Ich war vorige Woche wiedermal mit meinem geschätzten Arbeitskollegen unterwegs, dermal im Schlosspark Schönbrunn. Während die Experimente mit dem Graufilter doch eher gewöhnungsbedürftig waren, hat es mir die Natur und die Gärtner mal wieder leicht gemacht ein paar schöne Motive vor die Linse zu kriegen, wie z.B. die Allee zur nachgebauten römischen Ruine. Auch ein Eichhörnchen hat sich blicken lassen. Eigentlich sogar drei, aber nur eines konnte ich gut ablichten. Wie immer hab ich mit der Perspektive gespielt, wie man am Baum-Foto sieht. Hier direkt am Blog möchte ich euch mit dem Anblick, der einem direkt beim Betreten des Parks ins Auge fällt, konfrontieren.

Kalenderwoche 16 – the park

KW16: the park

Achja, auf Flickr gibts die Fotos meines Kollegen.

Ähnliche Artikel:

Mit Bash prüfen ob das eigene Script gerade läuft

Die Problemstellung

Ein Script soll alle x Minuten laufen und eine bestimmte Tätigkeit auf dem Server ausführen.

Nun kann es vorkommen, dass das Script aber länger braucht als die Zeitspanne bis zum nächsten Aufruf desselben Scripts (z.B. Kopier und Backup Jobs, Mails abholen, …)

Natürlich sollte so ein Script dann nicht ein 2tes Mal gestartet werden sondern die Ausführung übersprungen werden. Zu diesem Zweck möchte ich hier ein kleines Bash Script zeigen, das genau diesen Zweck erfüllt.

Die Lösung

#!/bin/bash
#
# testpid.sh - demo script to show how to check if a script
# with the same name is currently running
#
# by Leo Eibler
# resources:
#    http://www.eibler.at
#    http://leo.sprossenwanne.at
#    http://www.nullpointer.at
#

# PID - pid of the current script
PID=$$
# SCRIPTNAME - current name of the script without directory prefix
SCRIPTNAME=`basename $0`
# PIDFILE - where to write the current pid
PIDFILE=/tmp/$SCRIPTNAME.pid

# ENDEXECUTION - if 1 then stop script, if 0 everything is ok and continue
ENDEXECUTION=0

if [ -f "$PIDFILE" ]
then
    RUNNINGPID=`cat "$PIDFILE"`
    echo "got pid from $RUNNINGPID from pidfile '$PIDFILE'"
    PROGRAMPID=`ps -e | grep "$SCRIPTNAME" | grep -v grep | awk '{print $1;}'`
    for PIDEL in $PROGRAMPID
    do
        echo "testing pid of running scripts '$PIDEL' == '$RUNNINGPID' from pidfile"
        if [ "$PIDEL" == "$RUNNINGPID" ]
        then
            echo "found PID $RUNNINGPID current running - end execution"
            ENDEXECUTION=1
            break
        fi
    done
fi

if [ "$ENDEXECUTION" == "1" ]
then
    echo "Current script '$SCRIPTNAME' already running (pid $RUNNINGPID) - end execution"
    exit 1
fi
# writing PID to pidfile
echo $PID > $PIDFILE

#
# ---- START ----
#

echo "do your stuff here ..."
sleep 5
echo "... end script"

#
# ---- END ----
#

# delete pidfile
rm $PIDFILE
exit 0

Die Erklärung

Zuerst holt sich das Script den eigenen Namen mit basename $0 ($0 würde ebenfalls den Pfad des Scriptaufrufs enthalten aber hier würde der spätere Aufruf von ps bzw. das automatische Erstellen und Auslesen des passenden pid-Files scheitern).

Mit dem Namen des Scripts wird dann versucht ein pid-File (welches die Process-ID des aktuell laufenden Scripts enthält) auszulesen. Der Pfad des pid-Files kann beliebig gewählt werden, jedoch muss das Script natürlich Schreibrechte auf die Datei besitzen.

Falls kein pid-File existiert kann das Script davon ausgehen, dass es derzeit nicht bereits läuft und seine eigentliche Arbeit aufnehmen.

Falls jedoch ein pid-File vorhanden ist, wird dieses ausgelesen und mit allen derzeit laufenden Process-IDs von Prozessen mit dem gleichen Namen wie das Script verglichen.

Wird hierbei eine Übereinstimmung gefunden, dann läuft das Script bereits und durch Setzen der Variable $ENDEXECUTION auf 1 wird der Abbruch signalisiert.

Dieser Vergleich mit den Process-IDs von Prozessen die bereits laufen ist deswegen wichtig, da es ja sein könnte, dass das Script beim vorherigen Aufruf zwar ein pid-File angelegt hat, aber danach abgebrochen wurde (z.B. manuell durch den Benutzer) und das pid-File dadurch nicht gelöscht wurde.

Ist die Überprüfung auf eine laufende Instanz negativ, muss zuerst das pid-File angelegt werden (Die Variable $$ enthält die pid des aktuellen Prozesses).

Nach Beendigung der Arbeit sollte danach das pid-File wieder gelöscht werden um einen sauberen Abschluss zu bilden.

Das Script als Download gibts hier.

 

Ähnliche Artikel:

Fotowoche KW15: orchid in orange

orchid in orange – Impression einer Orchidee. Dass der Hintergrund (ein simpler Vorhang) so malerisch wirkt hätte ich mir beim Fotografieren nicht erträumt.

Ja, es ist nichts Neues, ich bin spät dran. Dennoch möchte ich euch diese Impression einer Orchidee nicht vorenthalten. Dass der Hintergrund (ein simpler Vorhang) so malerisch wirkt hätte ich mir beim Fotografieren nicht erträumt.

Kalenderwoche 15 – orchid in orange

orchid in orange

Ähnliche Artikel:

Dateien zählen unter Linux

Otto Normal hat mit Datein Zählen unter Windows sicher keine Probleme und die meisten Linuxuser unter dem Betriebssystem ihrer Wahl wohl auch nicht. Will aber Otto mal in Linux reinschnuppern und dort Dateien zählen, stellt ihn das als Laien vor eine respektable Herausforderung.

Otto Normal hat damit unter Windows sicher keine Probleme und die meisten Linuxuser unter dem Betriebssystem ihrer Wahl wohl auch nicht. Will aber Otto mal in Linux reinschnuppern und dort Dateien zählen, stellt ihn das als Laien vor eine respektable Herausforderung.

Um sich den Inhalt eines Verzeichnisses aufzurufen ist ihm wahrschienlich schon der Befehl

ls

bekannt. ls steht für “list” Doch liefert dieser Befehl lediglich eine Auflistung des Inhalts des gegenwärtigen Verzeichnisses. Daher muss diese Ausgabe noch ausgewertet werden. Hierfür setzen wir Pipes | ein mit denen man mehrere Kommandos miteinander verbinden kann. Hierbei wird jeweils die Ausgabe des vorhergehenden Befehls als Eingabe für den nächsten Befehl herangezogen.

ls –1 | wc –l

wir haben hierbei den ls Befehl um den Parameter –1 (Zahl Eins) erweitert der für eine lange Listenform steht. Es wird somit jedes Element in einer extra Zeile angeführt. Die Ausgabe davon wird per Pipe an den wc Befehl weitergeleitet. wc steht in diesem Fall für Word Count. Erneut über einen Parameter –l (kleines L) weisen wir wc darauf hin, dass es die Zeilen zählen soll, die es übergeben bekommt.

Achtung! Wurde statt der 1 ein kleines L als Parameter an ls übergeben ist die Ausgabe um eins größer als die Anzahl der Elemente. Dies liegt daran, dass dabei noch eine weitere Zeile Output erzeugt wird, die keine Datei wiederspiegelt.

ls –l <targetdir> | wc –l

Wollen wir nicht direkt das Ergebnis aus dem Verzeichnis in dem wir uns befinden, können wir das Zielverzeichnis am ls Befehl anhängen.

Fürs erste kann man damit zufrieden sein, doch bei genauerer Betrachtung stößt man dabei rasch an die Grenzen des Befehls. Man zählt nämlich symbolische Links und Verzeichnisse und Dateien gleichermaßen.

Wir tauschen nun also den list Befehl gegen einen spezialisierteren Befehl  aus: find

find <targetdir> –maxdepth 1 –type f | wc –l

Mit -type f schränkt man die Auflistung der Ergebnisse auf Datein (files) ein. Dies könnte man z.B. auch auf Verzeichnisse (directorys) einschränken: –type d

Achtung, bei der Auflistung der Verzeichnisse wird das gegenwärtige Verzeichnis . mitgezählt, vom Gesamtergebnis also wieder eins abziehen.

Von Haus aus würde der find Befehl alle Unterverzeichnisse absuchen. Mittels –maxdepth <zahl> kann die Tiefe die er dabei erreicht steuern. Die 1 aus dem Beispiel oben steht hierbei nur für das Wurzelverzeichnis. Möchte man lediglich eine Verzeichnisebene tiefer wäre –maxdepth 2 der passende Parameter.

Will man nun auch wieder die symbolischen Links in seinem Suchergebnis dabei haben muss man den find Befehl noch um den –follow Parameter erweitern

find <targetdir> –maxdepth 1 –type f –follow | wc –l

Möchte man nun noch auf Dateiendungen oder anderen Teilen des Dateinamens einschränken gilt es noch den -name ‚*.txt‘ Parameter zu erwähnen. Zwischen den Anführungszeichen wir der Suchbegriff angeführt, * und ? gelten dabei als die üblichen Wildcards.

find <targetdir> -maxdepth 1 -type f -follow -name '*.t?t' | wc -l

Happy counting!

PS: Rekursives suchen wäre mit dem ls Befehl mittels –R Parameter möglich

Ähnliche Artikel:

Fotowoche KW14: deffodils

Eigentlich wollte ich ja für heute ein Osterfoto schießen. Die Szenerie war auch schon perfekt, Lichteinfall, Winkel, Dekoration. Die Leute in meinem Heimatort haben sich echt Mühe gegeben. Ein Baum voller Ostereier und im Hintergrund eine mannshohe Strohpuppe, welche die Frau vom Osterhasen in Tracht darstellt. Perfekt!

Und dann kommt dem ein kleines unscheinbares Blümchen, ein Märzenbecher, dazwischen.

Eigentlich wollte ich ja für heute ein Osterfoto schießen. Die Szenerie war auch schon perfekt, Lichteinfall, Winkel, Dekoration. Die Leute in meinem Heimatort haben sich echt Mühe gegeben. Ein Baum voller Ostereier und im Hintergrund eine mannshohe Strohpuppe, welche die Frau vom Osterhasen in Tracht darstellt. Perfekt!

Und dann kommt dem ein kleines unscheinbares Blümchen, ein Märzenbecher, dazwischen.

Kalenderwoche 14 – deffodils

daffodils

Ähnliche Artikel: