phpbar.de logo

Mailinglisten-Archive

AW: [php] Script gezielt beenden

AW: [php] Script gezielt beenden

Wolfgang Hauck php_(at)_phpcenter.de
Fri, 2 Aug 2002 11:45:00 +0200


Hi Norbert,

Ich hab mal sowas in perl realisiert. Dazu wird das Script über eine shell
gestartet und mit & von der Konsole abgehängt. Das Script sieht
folgendermassen aus:

#!/bin/sh
# chkconfig: 235 99 00
# description: Start or stop database triggers

case "$1" in
'start')
	perl /ein/pfad/triggers.pl /ein/pfad/triggers.conf start &
	;;
'stop')
	perl /ein/pfad/triggers.pl /ein/pfad/triggers.conf stop &
	;;
'status')
	perl /ein/pfad/triggers.pl /ein/pfad/triggers.conf status
	;;
*)
	echo "Usage: $0 { start | stop | status}"
	;;
esac
exit 0

Das Perlscript selbst prüft

1. Wurde das Script schon einmal gestartet?
2. Wenn ja und start --> abbrechen, soll ja nicht zweimal laufen
sonst
Status ausgeben oder Haltesignal * absetzten.

3. Wenn nein und Start ausführen.

Wenn ich jetzt ein sh triggers start absetze wird mein Script gestartet.
Bei sh triggers stop verzweigt das erste Script in eine Routine, die alle
Buffers zurückschreibt und das Script ordenlich beendet.

Das folgende Zeugs ist zwar nicht php sondern perl, macht aber in etwa das
Konzept sichtbar:

###############################################################
#
#  Prüfen ob der Prozess schon gestartet wurde
#
###############################################################

sub prozess_gestartet {
  $status = "angehalten";
  $Pid_File = Proc::PID_File->new(path=>$pidfile);
  if (!$Pid_File->init)  { die "Kann pid file: $! nicht erstellen" }
  if ($Pid_File->active) {
    $Pid_File = Proc::PID_File->new(path=>$pidfilestop);
    if (!$Pid_File->init)  { die "Kann  pid file: $! nicht erstellen" }
    if ($Pid_File->active) {
    if  (_(at)_ARGV[1] eq "status" || _(at)_ARGV[1] eq "status") {
      $status = "wird angehalten";
    } else {
      $meldung = "Der Prozess $Scriptname wird bereits angehalten\n";
      $beenden = "true";
    }
  }
  if ((_(at)_ARGV[0] eq "stop" || _(at)_ARGV[1] eq "stop") && $beenden eq "false") {
    system("clear"); # Bildschirm löschen
    print "Der Prozess \"$Scriptname\" wird angehalten!\n";
    open(Datei,"<$pidfile") || die "Datei \"/var/run/triggers.pid\" nicht
gefunden\n";
    while(<Datei>) {
      chomp $_;
      push(_(at)_zeilen,$_);
    }
    close(Datei);
    while (1 eq 1) {}
  }
  if  ((_(at)_ARGV[1] eq "status" || _(at)_ARGV[1] eq "status") && $beenden eq
"false") {
    if ($status ne "wird angehalten") {$status = "läuft";}
  } else {
    if ($beenden eq "false") {
      $meldung = "Der Prozess $Scriptname wird bereits ausgeführt!\n";
      $beenden = "true";
    }
  }
 }
}

##############################################################
#
# Abbruchbedingung prüfen Aufruf:$ perl triggers.pl stop
#
##############################################################

sub abbruch{
  open(Datei,"<$pidfilestop");
  while(<Datei>) {
    chomp $_;
    push(_(at)_zeilen,$_);
  }
  close(Datei);
  my $killPID = $zeilen[1];
  if ($killPID ne "") {
#    Hier musst du dein Buffers retten usw....
#
#
#
#
    system('kill -9 '.$killPID);
    unlink $pidfilestop;
    $dbh->disconnect();
    system("clear");
    $subject = "Prozess \"$Scriptname\" heruntergefahren";
    $data = "Der Prozesss \"$Scriptname\" wurde am ";
    $data .= maildatum();
    $data .= " beendet!\n\nDie Löschweitergabe bzw. - prüfung wird nicht
mehr ausgeführt!\n\n";
    print $data;
    sendmail();
    $beenden = "true";
  }
}



##############################################################
#
# BEGINN DER SCHLEIFE
#
##############################################################

sub Schleife {
   while ($beenden eq "false") {
      # Hier kommt dein Code rein!
    }
    if ($beenden eq "false") {
      abbruch();
    }
    if ($beenden eq "false") {
      sleep $wait;
    }
    if ($beenden eq "false") {
      abbruch();
    }
  }
}




#################################################################
#
#                   Initialisierung                             #
#
#################################################################

$beenden = "false";
if($config{'printing'} eq "true") {
  system("clear"); # Bildschirm löschen
}
lese_Konfiguration();
pruefe_Uebergabe();
if ($beenden eq "false") {
  prozess_gestartet();
  if ($beenden eq "false") {
    pruefe_stop();
    if ($beenden eq "false") {
      #POSIX::setsid() or die "Konnte keine neue Session starten: $!";
      Datenbankverbindung();
      konfigurationsausgabe();
      if ($beenden eq "false") {
        if ($config{'printing'} eq "true") {
          print "Initialisierung\n";
        }
        Initialisierungen();
        Schleife();
      }
    }
  }
}




* Das Haltesignal habe ich in meinem Falle in ne Datei geschrieben mit der
pidnummer des zu stoppenden Prozesses. Gibt aber mit Sicherheit auch andere
Möglichkeiten.

MFG Wolfgang


php::bar PHP Wiki   -   Listenarchive