Mailinglisten-Archive |
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