script zur Überprüfung von laufenden Prozessen

N

noob222

Mitglied
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 "Das ist der $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 :-)
Also die for-Schleife sollte doch korrekt sein oder?

mfg
 
Zuletzt bearbeitet:
Hallo
Leider geht hier nicht daraus hervor, welche Rückgabewerte die verwendeten Funktionen geben.
Allerdings hast du wohl ein führendes Leerzeichen bei dem Dateinamen verwendet und die Zuweisung schließt nicht mit Semikola ab.
Dass allein müsste dir schon enen satten Syntaxfehler liefern!
Du verwendest kein use strict?
Warum nicht?
Andere Seite der Geschichte:
Ob eine Datei erfolgreich zum Lesen oder Schreiben geöffnet werden konnte, erfährst du, indem du das übliche or die "Fehlermeldung: datei $file konnte nicht......." beim Öffnen und Schließen verwendest.

Gruß Wolfgang
 
Hallo,
ich bin es nochmal. Habe in den alten Einträgen einige Sachen gelöscht die nicht mehr relevant sind.

Ich habe ein Problem mit meiner For-Schleife beim main-Programm.
Wie gesagt werden die Prozesse manchmal auf anhieb beendet und manchmal nicht.
Mit der for-Schleife wollte ich in 3 Durchgängen sicherstellen, das die Prozesse beendet werden sollen.
Mein Script hat die letzten male alle Prozesse beim 0. Durchgang beendet. Diesbezüglich bekam ich auch immer die korrekte Meldung: "Das ist der 0. Durchlauf".
Jetzt sind aber nicht alle Prozesse beendet wurden und meine for-Schleife wird anscheinend nur einmal ausgeführt. In der Subroutine kann er den Prozess3 nicht killen und geht nicht mehr zurück in die for-Schleife rein.

Was habe ich bei der for-Schleife falsch gemacht?

Hier ist mal der komplette Code zu dem Programm:

Code:
#!/usr/bin/perl

use strict;
use Config;
use Getopt::Std;
use warnings;

#
# globale Variablen
#
my $prozess1 = undef;	# Prozess 1
my $prozess2 = undef;	# Prozess 2
my $prozess3 = undef;	# Prozess 3
my $zaehler = 0;	# Zaehler fuer die Schleife
my $max_durchlauf = 3;  # Max. Durchlauf der Schleife

#
# Die Ausgaben in eine vorhandene Datei schreiben
#
my $file = '/user/home/hierIstMeinPerlScript/test.txt';

eval {
	for($zaehler=0; $zaehler<$max_durchlauf; $zaehler++){
		beende_prozesse() if prozesse_vorhanden();
		if ( prozesse_vorhanden() ) {
                        open(TEST, ">$file") or die "Dateifehler !";
			print TEST "Das ist der $zaehler. Durchlauf\n";
                        close(TEST);
			beende_prozesse();	
                } else {
                        open(TEST, ">$file") or die "Dateifehler !";
			print TEST "Keine Prozesse am laufen\n";
                        close(TEST);
		}
	
	}
};
if ($@) {
	&print_errors( $@ );
}


#
# ende von main program
#
exit 0;


#
# Subroutine überprüft ob noch prozesse laufen und gibt gegebenfalls die Prozess-id raus
#
sub prozesse_vorhanden {

	my $return_value=0;

	# alle prozesse auf undef setzen
	$prozess1 = undef;
	$prozess2 = undef;
	$prozess3 = undef;
	$pid_pl = undef;

	# ausgabe der prozesse könnten so aussehen
	# user 25155 25139  0 11:03:03 ?    2:03 /usr/java/jre/bin/java_prozess1 -classpath /pfad/zu/prozess:/o
	# user 12958 12956  0 20:16:14 ?        1:08 /usr/java/jre/bin/java_prozess2 -cp /pfad/zu/prozess:/o
	# user 25158 25139  0 11:03:03 ?    3:03 /usr/java/jre/bin/java_prozess3 -classpath /pfad/zu/prozess:/o
	
        my $command = "/usr/ucb/ps -auxwww | grep java_";
        # print "About to execute command \"$command\" using back ticks\n";
	my $ps = `$command` or die "Failed to execute command \"$command\" using back ticks: $!";

	# überprüfe laufende prozesse
	my @lines = split(/\n/, $ps);
	for(my $i=0; $i<$#lines; $i++) {
		my $line = $lines[$i];
	

		# überprüfe prozess1
		if ($line =~ /\s*(user)\s*(\d*)(.*)(\/usr\/java\/jre\/bin\/java_prozess1)(.*)/) {
			$prozess1 = $2; 
                        open(TEST, ">$file") or die "Dateifehler !"; 
			print TEST "Prozess1 läuft noch immer mit id $prozess1\n";
			close(TEST);
                        $return_value=1;
		}

		# überprüfe prozess2
		if ($line =~ /\s*(user)\s*(\d*)(.*)(\/usr\/java\/jre\/bin\/java_prozess2)(.*)/) {
			$prozess3 = $2; 
                        open(TEST, ">$file") or die "Dateifehler !"; 
			print TEST "Prozess2 läuft noch immer mit id $prozess2\n";
                        close(TEST);
			$return_value=1;
		}

		# überprüfe prozess2
		if ($line =~ /\s*(user)\s*(\d*)(.*)(\/usr\/java\/jre\/bin\/java_prozess3)(.*)/) {
			$prozess2 = $2; 
                        open(TEST, ">$file") or die "Dateifehler !"; 
			print TEST "Prozess3 läuft noch immer mit id $prozess3\n";
                        close(TEST);
			$return_value=1;
		}

		
	}
	return $return_value;
}


#
# Subroutine beended laufende prozesse

sub beende_prozesse {
	sleep(5);
	&system_command("kill $prozess3") if defined($prozess3);
        open(TEST, ">$file") or die "Dateifehler !";
	print TEST "ServerManager wurde beendet\n";
        close(TEST);
	sleep(2);
        open(TEST, ">$file") or die "Dateifehler !";
	&system_command("kill $prozess1") if defined($prozess1);
        close(TEST);
	sleep(2);
        open(TEST, ">$file") or die "Dateifehler !";
	&system_command("kill $prozess2") if defined($prozess2);
        close(TEST);
	sleep(2);
        open(TEST, ">$file") or die "Dateifehler !";
	&system_command("kill $pid_pl") if defined($pid_pl);
        close(TEST);
	sleep(2);
}
 

Ähnliche Themen

Verschlüsseltes Backup-Script mit rsync

Zugriff Ubuntu 16.04. auf Freigabe 18.04. LTS nicht möglich

[Perl] Perl OO Methodenaufruf in anderem Objekt

perl script, das Dateien aus einer Liste löscht

Queue für copy Script

Zurück
Oben