PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Webserver überwachen und evtl. neustarten



Spoofy
23-04-2001, 10:29
Hallo,

leider ist Shell-Programmierung nicht so 100%ig mein Ding, deswegen meine Frage an euch:

Ich möchte meinen Webserver überwachen (Prozess aktiv oder nicht) und falls der httpd nicht läuft, soll er automatisch neu gestartet werden.

Habt ihr eine Idee?

Thx :)
Spoofy

PS: Es genügt, wenn der Daemon alle 15 min abgefragt wird.

pitu
23-04-2001, 12:26
Auf SuSE:



#!/bin/bash

TMP=`rcapache status`

case $TMP in
*"OK"*)
exit 0
;;
*)
rcapache restart
;;
esac
exit 0


Entsprechende Anpassungen fuer andere Distributionen.

thorsten

rbla
25-04-2001, 17:42
du kannst den webserver auch über init starten (man inittab)
oder benutze daemontools und supervise-scripts (http://www.em.ca/~bruceg/rpms/daemontools/ http://www.em.ca/~bruceg/supervise-scripts/)
die rpms funktionieren (wahrscheinlich) nicht für suse, nimm ggf. die tar sourcen

Spoofy
09-05-2001, 10:14
Vielen Dank für eure Hilfe - leider hat es so nicht geklappt...
Habe mit Hilfe meines Kollegen folgendes Script geschrieben:

#!/usr/bin/perl
use LWP::UserAgent;
use HTTP::Request;
use HTTP::Response;
use URI::Heuristic;

$ua = LWP::UserAgent->new();

unless (@ARGV[0] eq 'start' || @ARGV[0] eq 'stop' || @ARGV[0] eq 'restart' || @ARGV[0] eq 'permanent') {
aufrufSyntax();
}
#$debug=1;
$sleepTime = 30;
if (@ARGV[0] eq 'permanent' && @ARGV[1] > 0) {
$sleepTime = @ARGV[1];
}

if (@ARGV[0] eq "permanent" && @ARGV[2] ne "do_bg") {
$command = "$0 @ARGV[0] $sleepTime do_bg &";
system($command);
exit 0;
}


if ($^O eq 'solaris') {
$prc = "ps -ef|grep root |awk '/httpd/ { print \$2, \$9, \$10, \$11 }'|";
@commandlist = (
'/path_to/httpd -DSSL',
);
$logfile="/path_to/httpd_ctrl.log";
# $prc = "ps -ef|awk '/httpd/ { print \$1, \$5, \$6, \$7 }'|";
# $killPrc = "ps x|awk '/httpd/ { print \$1, \$5, \$6, \$7 }'|";
$webpath="http://www.databecker.de/check/test.html";
}
elsif ($^O eq 'linux') {
@commandlist = (
'/path_to/httpd -f /path_to/httpd.conf'
);
# '/path_to/httpd -f /path_to/admserv/httpd.conf',
# '/path_to/ivw/httpd'
$logfile="/path_to/httpd_ctrl.log";
$httpdPath='\/path_to\/httpd \-f \/path_to\/conf/';
$prc = "ps x | awk '$httpdPath { print \$1, \$5, \$6, \$7 }'|";
$killPrc = "ps \-ef | awk '$httpdPath { print \$2 }'|";
$webpath="http://www.pcpraxis-networld.de/check/test.html";
}
else {
die "Keine Befehle fuer '$^O' vorgemerkt\n";
}

open (LOGFILE, ">>$logfile") or die "Kann Logdatei nicht oeffnen!\n";
$fhandle=*LOGFILE;
$ptime=gettime();
logging($fhandle, "\n--------\nDienst gestartet. Aufruf: $0 $ARGV[0] $ARGV[1] $ARGV[2] -- $ptime --");
while (true) {
%procHash = ();
@tmplist = ();
open STATUS, "$prc" or die "Kann das fork-Kommando nicht ausfuehren: $! \n\n $prc";
while (<STATUS>) {
chomp;
@tmplist = split;
$pid = shift @tmplist;
$proc = join(" ", @tmplist);
push @{$procHash{$proc}}, $pid;
}
close STATUS or die "Schlechtes ps-Kommando: $! $?";

if (lc(@ARGV[0]) eq "permanent") {
close $fhandle;
sleep $sleepTime;
open (LOGFILE, ">>$logfile") or die "Kann Logdatei nicht oeffnen!\n";
$fhandle=*LOGFILE;
$status = verifyHttp();
if ($status ne 'OK') {
$ptime=gettime();
logging ($fhandle, "$status beim HTTP-FileCheck -- $ptime");
killProcs();
$ptime=gettime();
logging ($fhandle, "Prozesse beendet -- $ptime");
$status = startProcs();
$ptime=gettime();
if ($status ne 'OK') {
logging ($fhandle, "$status -- $ptime");
}
else {
logging ($fhandle, "Prozesse erfolgreich gestartet -- $ptime");
}
}
else {
logging($fhandle, "$status beim HTTP-FileCheck") if defined $debug;
}
close $fhandle;
}
elsif (lc(@ARGV[0]) eq 'start') {
$tmp = '';
$cnt1 = 0;
$cnt2 = 0;
$cnt3 = 0;
foreach $cmd (@commandlist) {
$cnt1++;
$cnt2 = 0;
foreach $i ( 0 .. $#{ $procHash{$cmd}}) {
$cnt2++;
}
$cnt3++ if $cnt2 > 0;
}
if ($cnt1 == $cnt3) {
print "
HTTPD-Prozesse bereits gestartet.\n";
}
else {
$status = startProcs();
if ($status eq 'OK') {
print "
HTTPD-Prozesse erfolgreich gestartet.\n";
}
else {
print "
$status\n";
}
}
ende($fhandle);
}
elsif (lc(@ARGV[0]) eq 'restart') {
killProcs();
$status = startProcs();
if ($status eq 'OK') {
print "
HTTPD-Prozesse erfolgreich gestartet.\n";
}
else {
print "
$status\n";
}
ende($fhandle);
}
elsif (lc(@ARGV[0]) eq 'stop') {
$status = killProcs();
if ($status eq 'OK') {
print "
HTTPD-Prozesse erfolgreich beendet.\n";
}
ende($fhandle);
}
}

sub ende {
my $fhandle = shift;
$ptime=gettime();
logging($fhandle, "-- Dienst beendet $ptime --");
if ($fhandle) {
close $fhandle;
}
exit 0;
}

sub logging {
my $fhandle = shift;
my $tmp=shift;
if ($fhandle) {
print $fhandle $tmp."\n";
}
else {
print $fhandle;
}
}

sub startProcs {
foreach $cmd (@commandlist) {
if (defined $debug) {
print "$cmd \n";
}
else {
system($cmd);
$? == 0 &#0124;&#0124; return "Fehlercode: $?";
}
}
return "OK";
}


sub killProcs {
my @pids=();
open PROCS, "$killPrc" or die "Kann das fork-Kommando nicht ausfuehren: $! \n\n $prc";
while (<PROCS>) {
chomp;
push @pids, $_;
}
close PROCS or die "Schlechtes ps-Kommando: $! $?";
foreach my $pid (sort { $a <=> $b } @pids) {
if (defined $debug) {
print "$pid\n";
}
else {
kill('TERM',$pid);
sleep 1;
kill('KILL',$pid);
}
}
return "OK";
}

sub gettime {
my @timelist = localtime(time());
$timelist[ 4 ] += 1 ;
$timelist[ 5 ] += 1900 ;
foreach $elem (@timelist) {
$elem="0".$elem if $elem < 10;
}
return "Datum/Uhrzeit: ".$timelist[3].".".$timelist[4].".".$timelist[5]." / ".$timelist[2].":".$timelist[1].":".$timelist[0];
}

sub aufrufSyntax {
print "
Aufruf: \"$0 start\"
oder: \"$0 stop\"
oder: \"$0 restart\"
oder: \"$0 permanent [SEKUNDEN]\"
(als Pruefintervall)\n";
exit 0;
}

sub verifyHttp {
my $raw_url;
my $url;
my $req;
my $response;
$ua->agent('Perl HTTPD-Checker');
$raw_url = $webpath;
$url = URI::Heuristic::uf_urlstr($raw_url);
$req = HTTP::Request->new(GET => $url);
$req->referer('http://script.webserver.de');
$response = $ua->request($req);
if ($response->is_error()) {
return $response->status_line;
}
else {
return "OK";
}
}



Wir mussten zusätzlich noch überprüfen, ob httpd-Prozesse hängen.

Greetz aus Düsseldorf
Spoofy

"Open Minds - Open Sources - Open Future"

[ 09. Mai 2001: Beitrag editiert von: Spoofy ]