/usr/bin/spawn-fcgi überwachen & bei Bedarf restart

#1
Guten Morgen, oder ne besser; Guten Tag ;)

Folgendes, ich monitore so ziemlich alle auf meinem Server laufenden Prozesse (es handelt sich hier um einen nicht Isconfig Server).
Prozesse die mir abbrechen werden automatisch neu gestartet, alles soweit tutti, jedoch ein Prozess bekomme ich nicht sauber überwacht.
Code:
/usr/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -u www-data -g www-data -f /usr/bin/php5-cgi -P /var/run/fastcgi-php.pid
Hat hier jemand einen Codeschnipsel o.ä für die Überprüfung und falls der Prozess nimmer läuft einen Restart mit obigen Angaben.
Ich habe versucht mir für Monit etwas zu basteln, jedoch bekomme ich damit den Prozess /usr/bin/spawn-fcgi zwar gestartet jedoch ohne die Zusatzoptionen was zwingend ist, da der Prozess ja nur als Beistück zu meinem nginx für php benötigt wird.

Thx schonmal.

Gruß aus Bayern,

Sven
 
#2
So ich hab die Lösung falls es wer später mal braucht.
Ich hab nen minütlichen Crontab angelgt der folgendes Script aufruft.
Das Script habe ich im Netz gefunden, allerdings umgeschrieben damits auch auf Debian Squeeze passt. Es können noch kleine Fehler drin sein, da ichs erstmal nur fix angepasst hab damit es tut.

Gruß Sven

PS: Wer wie bei mir Mails vom Cron eh gesendet bekommt, kann den Mailpart draussen lassen. Sonst kommt alles doppelt und 100 fach ;)

Code:
#!/bin/sh
# (bof)

# Base directory
cd $(dirname $0)
base=$(pwd)

# Temp file
tmp="/tmp/fix.$$"

# Output to file?
[ -n "$1" ] && exec 1>$tmp 2>&1 3>&1

echo ""

# Settings
php="/usr/bin/php5-cgi"

# Init
must_kill=0
must_start=0

# Running?
pids=$(ps ax | grep "$php$" | grep -v "grep" | cut -d"?" -f1 | tr -d " ")
if [ "$pids" != "" ]
then
a=$(telnet localhost 9000 | grep "Connected to localhost")
if [ "$a" = "" ]
then
echo "PHP is running but NOT accepting connections!"
must_kill=1
must_start=1
else
echo "PHP is running and accepting connections!"
fi
else
echo "PHP is stopped!"
must_start=1
fi

# Must kill?
if [ $must_kill = 1 ]
then
echo "Stopping PHP..."
for pid in $pids
do
kill $pid >/dev/null 2>&1
done

# Wait for all pids to disappear
pids="!"
while [ -n "$pids" ]
do
pids=$(ps ax | grep "$php$" | grep -v "grep" | cut -d"?" -f1 | tr -d " ")
done
echo "PHP was stopped"
fi

# Must start?
if [ $must_start = 1 ]
then
echo "Starting PHP..."
/usr/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -u www-data -g www-data -f /usr/bin/php5-cgi -P /var/run/fastcgi-php.pid
echo "PHP was restarted on name_of_your_server" | mail -s "servernachricht" du@domain.tld
echo "Mail gesendet"

fi

echo "Done!"
echo ""

# Clean up
rm -rf $tmp

# (eof)
 
Zuletzt bearbeitet:
#3
Ein letztes noch hier drunter, wer hin und wieder erlebt das der spawn-fcgi Prozess einfach abstürzt, gateway timeouts o.ä. wirft:
Es hilft folgende Zeile
Code:
/usr/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -u www-data -g www-data -f /usr/bin/php5-cgi -P /var/run/fastcgi-php.pid
so zu erweitern
Code:
/usr/bin/spawn-fcgi -F 1 -C 1 -a 127.0.0.1 -p 9000 -u www-data -g www-data -f /usr/bin/php5-cgi -P /var/run/fastcgi-php.pid
Kurz zur Erklärung:
-F und die darauf folgende Zahl bestimmt die Anzahl der Forks.
-C und die folgende Zahl die Anzahl der Child-Prozesse pro Fork.

Diese sind natürlich an die Bedürfnisse und Power des Servers anzupassen.

Warum es so besser funktioniert konnte ich auch nach längerem Suchen noch nicht finden. Jedoch fand ich in den Weiten des Netzes, nachdem ich mich mit stundenlangem debuggen rumgeschlagen hab genau diesen Lösungsansatz mehrfach.

Gruß Sven
 

Werbung