• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Perl: Script zum beenden laufender Prozesse

noob222

Newbie
Hallo. Habe ein Script welches nicht von mir stammt. Es überprüft ob Prozesse die eigentlich beendet werden sollten (mit einem anderen Script) aber noch immer laufen. Falls die Prozesse noch immer laufen so sollen sie mit diesem Script nachträglich beendet werden. Das Problem ist, das es manchmal funktioniert und manchmal nicht. Also das Script ist schon funktionsfähig aber er will irgendwie manchmal die Prozesse nicht auf Anhieb beenden.

Meine Aufgabe ist nun eine Zählschleife in dieses Script einzubauen, welches 3 mal die Schleifen durchlaufen soll und gegebenfalls die Prozesse beim 2 oder 3. Anlauf beenden soll, die er beim 1. Durchlauf nicht beenden konnte. Zudem möchte ich die Ausgaben (print-Ausgaben) in eine seperate Datei schreiben, damit ich überprüfen kann ob die Prozesse auch beendet wurden und bei welchem Durchlauf dies passiert ist.
Da ich nich so viel Ahnung von Perl habe, aber die Syntax mir von Java/Shell-Scripten bekannt vor kommt, habe ich jetzt folgendes gemacht.

Code:
#!/usr/bin/perl
#
# Globale Variablen
#

my $prozess1 = undef;    # 1. Prozess
my $prozess2 = undef;    # 2. Prozess
my $prozess3 = undef;    # 3.Prozess
my $zaehler  =  0;         #  Zähler fängt bei 0 an
my $max_durchlauf = 3;  #  Max. 3  Durchläufe

$file = ' /user/home/hierIstMeinPerlScript/test.txt' 
open(TEST, $file);
@lines = <TEST>;    
close(TEST);            
print @lines;            

eval {

        for($zahler=0; $zahler<$max_durchlauf; $zaehler++){
         beende_prozesse() if prozesse_vorhanden(); 
         if ( prozesse_vorhanden() ) {
                   open(TEST, ">$file");
                   print TEST "Zaehler ist beim $zahler . Durchlauf\n";
                   close(TEST);
           #die "Es sind nach wie vor Prozesse am laufen\n";
                   beende_prozesse();
         } else {
                   open(TEST, ">$file");
           print TEST "Keine Prozesse am laufen\n";
                   close(TEST);
         }

        }

};

if ($@) {

    &print_errors( $@ );

}

#
# Bis hierhin war das der Main-Programm 
#

exit 0;

Das habe ich ausgeführt und es hat geklappt. Zumindest wenn ich bei der for-schleife kein mißt gebaut habe :) jedoch habe ich es nicht geschaft, das die "print" Ausgaben in mein "test.txt"-Datei geschrieben werden. Damti wollte ich halt überprüfen wie viele Druchläufe das Script braucht um die Prozesse wirklich beenden zu können.
Habe ich da bei dem "close" und "open" falsch gemacht?
Also die for-Schleife soltle doch korrekt sein oder? Das mit dem open und clos Befehl habe ich mir duchgelesen und so übernommen. Die test.txt-Datei habe ich neu angelegt und dort steht nichts drin. Wenn ich mein Script ausführe steht da noch immer nichts drin. Das soll ich halt ändern. Da sollte (wäre gut für mich) wenn es geht folgendes drin stehen:

Code:
print TEST "Zaehler ist beim $zahler . Durchlauf\n";

Für eine kurze Hilfestellung wäre ich sehr dankbar.

mfg[/code]
 

abgdf

Guru
Hallo,

schreib doch erstmal oben (unter "#!/usr/bin/perl")
Code:
use warnings;
use strict;
rein, dann sollten da noch mehr Fehlermeldungen kommen.

$file muß an eine Stelle zeigen, wo Du auch Schreibrechte hast. Sollte dann schon so gehen:
Code:
open(TEST, ">$file") or die "Dateifehler !";
print TEST "Zaehler ist beim $zaehler. Durchlauf.\n";
close(TEST);
Erstmal soweit auf die Schnelle.

Viele Grüße
 
OP
N

noob222

Newbie
ne kurze frage: wo werden die Fehlermeldungen ausgeben? Also woher kann ich erkennen, das ich etwas falschen gemacht habe?
Ich arbeite unter einer Solaris Maschine und arbeite immer mit der Konsole.
Wie gesagt bin ich ein Neuling in Perl.

vielen Danke
 
OP
N

noob222

Newbie
Also mein Script läuft durch, nur werden die Ausgaben nicht in die Datei geschrieben wo ich es gerne hätte.

Ich hatte ja folgendes definiert gehabt:
Code:
$file = '/user/home/hierIstMeinPerlScript/test.txt';
open(TEST, $file);
@lines = <TEST>;   
close(TEST);           
print @lines;

muss ich das hier unbedingt definieren?
Code:
@lines = <TEST>;              
print @lines;

diese Konvention mit dem @lines und print @lines habe ich in einem Tutorial gelesen.
Blöderweise taucht in meinem Script in der Subroutine auch ein "@lines" auf. Diesbezüglich tauchen Fehlermeldungen auf. Daher meien Frage ob ich es oben bei open und close ZWINGEND definieren muss, weil ohne klappt es ja auch

vielen dank

ps: "use strict" und "use warnings" habe ich defniniert. Auch habe ich Schreibrechte auf test.txt.
 
OP
N

noob222

Newbie
ok, das problem war wirklich das ich die benannten zwei Zeilen weglassen kann, anscheindend sind sie nicht relevant.!!??
zudem hatte ich dummerweise vergessen und es trotz fehlermeldung nicht gesehen, eine zeile auszukommentieren.
es klappt jetzt so wie ich es möchte.

vielen dank
 
Oben