I believe this patch could resolve issues linked to bugs #446793, #484022 and
#448524 .
Patched init script seems to be able to handle missing or wrong PIDFILE and
also already started/stopped daemon.

I'm not completly confident in the LSB log functions order/usage but the script
behaves well for all the issue found in the three bugs mentionned above.

Patch:

--- thttpd.orig 2009-06-13 01:04:03.000000000 +0200
+++ thttpd      2009-06-13 01:06:13.000000000 +0200
@@ -12,57 +12,105 @@
 # Description:       thttpd is a small, fast secure webserver.
 ### END INIT INFO
 
-PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
-DAEMON=/usr/sbin/thttpd
-DESC="web server"
-NAME=thttpd
+set -e
+
+DAEMON='/usr/sbin/thttpd'
+DESC='web server'
+NAME=`basename "$DAEMON"`
 
-CONFFILE=/etc/thttpd/thttpd.conf
-PIDFILE=/var/run/thttpd.pid
+CONFFILE='/etc/thttpd/thttpd.conf'
+PIDFILE='/var/run/thttpd.pid'
 OPTIONS="-C $CONFFILE -i $PIDFILE"
 
-test -x $DAEMON || exit 0
-test -f $CONFFILE || exit 1
+test -x "$DAEMON" || exit 0
+test -f "$CONFFILE" || exit 1
 
-set -e
+. /lib/lsb/init-functions
+
+daemon_present() {
+       PID="$1"
+       if [ "$PID" ]; then
+               start-stop-daemon -K -q -p "$PID" -x "$DAEMON" -s 0 -- $OPTIONS
+       else
+               start-stop-daemon -K -q -x "$DAEMON" -s 0 -- $OPTIONS
+       fi
+}
+
+do_start() {
+       PID_REMOVED=0
+       if [ -f "$PIDFILE" ]; then
+               if daemon_present "$PIDFILE" ; then
+                       log_progress_msg "already running"
+                       log_end_msg 0
+                       return 0
+               fi
+               rm -f "$PIDFILE"
+               PID_REMOVED=1
+       fi
+       if daemon_present ; then
+               log_progress_msg "already running"
+               log_end_msg 0
+       else
+               set +e
+               start-stop-daemon -S -q -p "$PIDFILE" -x "$DAEMON" -- $OPTIONS
+               set -e
+               log_end_msg $? || true
+       fi
+       [ $PID_REMOVED -eq 1 ] && log_warning_msg "removed stale PID file"
+}
+
+do_stop() {
+       SIGNAL=$1
+       SIGNAL=${SIGNAL:-'USR1'}
+       if [ -f "$PIDFILE" ]; then
+               if daemon_present "$PIDFILE" ; then
+                       set +e
+                       start-stop-daemon -K -q -p "$PIDFILE" -x "$DAEMON" 
--signal "$SIGNAL"
+                       set -e
+                       log_end_msg $? || true
+                       rm -f "$PIDFILE"
+                       return 0
+               fi
+       fi
+       if daemon_present; then
+               set +e
+               start-stop-daemon -K -q -x "$DAEMON" --signal "$SIGNAL"
+               set -e
+               log_end_msg $? || true
+       else
+               log_progress_msg "already stopped"
+               log_end_msg 0
+       fi
+       if [ -f "$PIDFILE" ]; then
+               rm -f "$PIDFILE"
+               log_warning_msg "removed stale PID file"
+       fi
+}
 
 case "$1" in
        start)
-               echo -n "Starting $DESC: "
-               start-stop-daemon -S -q -p $PIDFILE -x $DAEMON -- $OPTIONS
-               echo "$NAME."
+               log_daemon_msg "Starting" "$NAME"
+               do_start
                ;;
 
        stop)
-               echo -n "Stopping $DESC: "
-
-               if ps ax | grep "$(cat $PIDFILE)" | grep -qv grep
-               then
-                       start-stop-daemon -K -q -p $PIDFILE -x $DAEMON --signal 
10
-               fi
-
-               echo "$NAME."
+               log_daemon_msg "Stopping" "$NAME"
+               do_stop
                ;;
 
        force-stop)
-               echo -n "Stopping $DESC: "
-               start-stop-daemon -K -q -p $PIDFILE -x $DAEMON
-               echo "$NAME."
+               log_daemon_msg "Stopping (forced)" "$NAME"
+               do_stop TERM
                ;;
 
        force-reload)
-               if start-stop-daemon -K -q -p $PIDFILE -x $DAEMON --test
-               then
-                       $0 restart
-               fi
+               $0 restart
                ;;
 
        restart)
-               echo -n "Restarting $DESC: "
-               start-stop-daemon -K -q -p $PIDFILE -x $DAEMON --signal 10
+               $0 stop
                sleep 1
-               start-stop-daemon -S -q -p $PIDFILE -x $DAEMON -- $OPTIONS
-               echo "$NAME."
+               $0 start
                ;;
 
        *)



Regards,
-- 
Rémi Laurent

GPG Key ID/Fingerprint:
    1024D/0FA00601 27F4 6810 2B0E 1AA0 CDAE  7C7B 3DC9 085A 0FA0 0601

Attachment: signature.asc
Description: Digital signature

Reply via email to