script zur Überprüfung von laufenden Prozessen

Diskutiere script zur Überprüfung von laufenden Prozessen im Ruby, php, Perl, Python ... Forum im Bereich Programmieren unter Linux/Unix; Hallo. Habe ein Script welches nicht von mir stammt. Es überprüft ob Prozesse die eigentlich beendet werden sollten (mit einem anderen Script)...

  1. #1 noob222, 22.08.2007
    Zuletzt bearbeitet: 02.09.2007
    noob222

    noob222 Mitglied

    Dabei seit:
    20.04.2007
    Beiträge:
    41
    Zustimmungen:
    0
    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
     
  2. #2 Wolfgang, 22.08.2007
    Wolfgang

    Wolfgang Foren Gott

    Dabei seit:
    24.04.2005
    Beiträge:
    3.978
    Zustimmungen:
    0
    Ort:
    Erfurt
    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
     
  3. #3 noob222, 02.09.2007
    noob222

    noob222 Mitglied

    Dabei seit:
    20.04.2007
    Beiträge:
    41
    Zustimmungen:
    0
    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);
    }
    
     
Thema:

script zur Überprüfung von laufenden Prozessen

Die Seite wird geladen...

script zur Überprüfung von laufenden Prozessen - Ähnliche Themen

  1. Python Script Hilfe

    Python Script Hilfe: Hey Leute, bin ganz neu hier und auch das Programmieren fällt mir noch nicht ganz so leicht... hab deswegen mal eine frage und hoffe jemand kann...
  2. Crontab und Scripts - Problem

    Crontab und Scripts - Problem: Hallo Zusammen Ich habe ein Script welches mittels Cronjob ausgeführt werden soll. Gemäss Log wird es auch ausgeführt, jedoch passiert nichts:...
  3. Script kopieren

    Script kopieren: Hallo, ich habe eine Frage: ich schreibe grade ein Unix script und möchte mit einem Befehl, eine bestimmte Bereich von diesem script in einem...
  4. Bräuchte Hilfe bei Backupscript mittels Bash und cronjob

    Bräuchte Hilfe bei Backupscript mittels Bash und cronjob: Es soll für bestimmte Ordner Archivierung aller Dateien(Logfiles), die älter als 30 Tage sind machen. Am besten einmal täglich nachts irgendwann....
  5. Bashscript aus Debian6 läuft nicht auf Debian7

    Bashscript aus Debian6 läuft nicht auf Debian7: Hallo an alle, nachdem ich ein Skript von squeeze auf wheezy kopiert habe und ausführte, erschienen gleich wilde Fehlermeldungen, nach denen ich...