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