[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

A kludged monit/pure-ftpd setup

From: Whit Blauvelt
Subject: A kludged monit/pure-ftpd setup
Date: Wed, 21 Jan 2004 16:41:23 -0500
User-agent: Mutt/1.5.4i


Pure-ftpd + pure-authd can sometimes (rarely) stop accepting logins
despite that they're both still running and look intact to basic monit


Have monit run an expect sequence to check that the login is actually


Pure-ftpd pid files can sometimes (rarely) just vanish, despite that the
daemon with that pid is still running, which causes monit to think the
pure-ftpd daemon itself has failed (when it hasn't) and monit can't restart
it (because it's still bound to the port, and monit doesn't have the pid to
stop it first). This means the first problem is no longer solved, since
monit won't check further once the pid file is missing.

Rube Goldberg-type Partial Solution:

Have monit run an external start script that kills all pure-ftpd daemons.
(This is a bad solution when running multiple pure-ftpd daemons since if
this is attached to more than one of them through monit, they'll be killing
each other and getting really ugly. What this still needs is a check so this
does _not_ kill and pure-ftpd daemon that still has a good pid file - doable
but I haven't scripted that yet.)

Anyhow, in case this is useful to anyone else, here are the pieces so far:

In /etc/monitrc (the number of expect "220.*" lines needs to be adjusted for
the length of your fortune - or lack of one):

  check process pure-ftpd with pidfile /var/run/
    start program ="/path/to/"
    stop program ="/path/to/"
    if failed host port 21 
          expect "220.*"
          expect "220.*"
          expect "220.*"
          expect "220.*"
          expect "220.*"
          expect "220.*"
          expect "220.*"
          expect "220.*"
          expect "220.*"
          expect "220.*"
          expect "220.*"
          send "USER someuser\n"
          expect "331.*"
          send "PASS somepass\n
          expect "230.*"
          expect "230.*"
          send "QUIT\n" 
          expect "221.*"
          then restart  
    if 5 restarts within 5 cycles then timeout
    group pure

In /path/to/

     #! /bin/sh

     # for debugging through monit -Iv
     set -vx
     # kill any and all pure-ftpd daemons
     getuids() {
        ps -e | grep pure-ftpd | awk '/pure/ { print $1 }'
     for PUID in $UIDs; do
        kill $PUID
     # kill pure-authd just to be safe
     kill `cat /var/run/`
     # restart pure-ftpd
     /usr/sbin/pure-ftpd [flags]
     # restart pure-authd
     /usr/sbin/pure-authd -s /var/run/ftpd.sock -r /path/to/ftpauthscript.php &

In /path/to/

     #! /bin/sh

     # for debugging through monit -Iv
     set -vx
     # kill the process with the id passed from monit
     if [ "x$MONIT_PROCESS_PID" != "x" ]
             kill $MONIT_PROCESS_PID

reply via email to

[Prev in Thread] Current Thread [Next in Thread]