script zur Überprüfung von laufenden Prozessen

Dieses Thema im Forum "Ruby, php, Perl, Python ..." wurde erstellt von noob222, 22.08.2007.

  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. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. #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
     
  4. #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. 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....
  2. 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...
  3. Shell Script Problem

    Shell Script Problem: Hallo zusammen, ich arbeite momentan mit einem Plagiat Tool, die ich über Git Bash ausführe. Es wird im Endeffekt ein Link generiert, die ich...
  4. Externes Programm mit Script ausführen?

    Externes Programm mit Script ausführen?: Hallo, ich würde gern ein Script zum klonen von festplatten schreiben z.B. mit dem Programm Mondo Rescue. Ist es möglich externen Programmen...
  5. sh Script zum Autostart

    sh Script zum Autostart: hallo liebe Mitglieder, wenn ich unter Linux eins meiner Shell Skripte im Autostart haben will nutze ich immer die @reboot Funktion im crontab....