Mit Perl-Skripten Daten für UNIX-Anwendungen übernehmen

Im folgenden Beispiel (den Programm-Code können Sie hier herunterladen) öffnet eine Anwendung viele Prozesse, alle mit demselben Namen. Um die Anwendung sauber zu beenden, muss der Administrator dem Parent-Prozess (und nur diesem) das kill-Signal schicken, und dieser kümmert sich um den Rest. In unserem Beispiel haben die Prozesse den Namen „mike“.

Theoretisch ist unser Skript recht einfach: run /usr/bin/ps und suche nach dem Prozess „mike“, der einen Parent-Prozess von 1 besitzt. Das tatsächliche Skript ist allerdings etwas komplizierter. Als ersten Schritt öffnen wir eine Pipe zu /usr/bin/ps (die Pfadangabe zu /usr/bin/ps müssen Sie evtl. anpassen):


open PS, "/usr/bin/ps -ef |";

Die open()-Funktion enthält den Namen des File-Handles (PS) als erstes Argument und den Namen des Befehls als zweites. In diesem Fall wollen wir die Standardausgabe STDOUT des Befehls als unseren Input verwenden, deshalb steht das Pipe-Symbol (|) hinter dem Befehl, genau so wie bei der UNIX-Kommandozeile.

Der nächste Schritt ist das zeilenweise Verarbeiten des Outputs. Dies erreichen wir mit einer while-Schleife:


while(<PS>) {
# hier der Schleifen-Code
}

Diese while-Schleife geht der Reihe nach alle Zeilen durch, die auf den üblichen UNIX-Zeilenwechsel enden (n), und weist den Wert jeder Zeile der Perl-Spezialvariablen $_ zu.

Was oft vergessen wird, ist das Entfernen des Zeichens /n (Zeilenumbruch) mit den Funktionen chop() oder chomp(). Die Funktion chop() entfernt einfach das letzte Zeichen der Zeile, ohne zu prüfen, ob es sich dabei wirklich um den Zeilenvorschub handelt. chomp() denkt hier mit und entfernt nur den Zeilenvorschub. In beiden Fällen wird dies automatisch auf die Variable $_ angewandt, wenn man die Funktion ohne Argument aufruft, also in unserem Fall auf die aktuelle Zeile.

Nun können wir uns den Daten in jeder Zeile zuwenden. Hier bietet sich die split()-Funktion an, um die Zeile in handhabbare Teile zu zerlegen. Das Problem dabei ist, dass nicht jede Zeile aus der selben Anzahl von Elementen besteht, die durch Whitespace voneinander getrennt sind. Je nachdem wie lange der Prozess schon läuft, kann die Zeile aussehen wie jedes der Beispiele in Listing B.

Der nächste Codeausschnitt (Listing C) zerlegt die Zeile zuerst in fünf Teile und dann den Rest (in $rest enthalten) je nach dem Datumsmuster.

Die split()-Funktion bedarf einiger Erklärung. Sie erwartet als erstes Argument einen regulären Ausdruck, als zweites den zu zerlegenden String. Optional kann mit einem dritten Argument festgelegt werden, in wie viele Teile der String zerlegt werden soll. split() gibt eine Liste mit den Einzelteilen zurück, die einem Array zugewiesen werden kann: @tmp=split() – oder einer Liste einzelner Variablen: ($var1, $var2)=split().

Der reguläre Ausdruck /s+/ unterteilt die Zeile an einem oder mehreren Whitespace-Zeichen. Das Muster in der zweiten Zeile von Listing C sucht nach jeder Zeile, die mit zwei Ziffern von 0 bis 9 beginnt, denen ein Semikolon folgt. (Wer seine Kenntnisse zu regulären Ausdrücken etwas auffrischen möchte, sei auf den Artikel Regular Expressions: Syntax enträtselt verwiesen.)

Der Name des Prozesses ist jetzt in der Variablen $cmd gespeichert, so dass es ein Leichtes ist, den richtigen Prozess herauszufinden und festzustellen, ob dieser zum Kernel gehört:


if (($cmd =~ /mike/) && ($ppid eq "1")) {
kill 'TERM', $pid;
}

Das war’s schon! Denken Sie daran: Sie finden das komplette Programm hier als Download.

Themenseiten: Anwendungsentwicklung, Software

Fanden Sie diesen Artikel nützlich?
Content Loading ...
Whitepaper

Artikel empfehlen:

Neueste Kommentare 

Noch keine Kommentare zu Mit Perl-Skripten Daten für UNIX-Anwendungen übernehmen

Kommentar hinzufügen

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *