Skip navigation

daemontools对服务的控制

通过 strace(1) daemontools的一些程序(svscan, svc, …), 可以简单了解daemontools对服务的控制方法。

  1. svscan 该进程会扫描(每5秒)/service目录,以确保每个对应的目录都有一个supervise来监控。
  2. supervise 该进程负责管理每个服务的运行。svc就是是通过与该进程的通信来控制对应服务的。

服务的删除方法

基于以上认知,删除一个daemontools启动的服务需要的步骤如下:

向svscan发送SIGSTOP信号,暂停svscan对/service的扫描。

pkill -STOP "^svscan$"

这一步是为了防止当我们杀掉supervise时,svscan又会重新启动新的supervise。

如果服务有log,先杀掉log的supervise进程

fuser -k /service/$SERVICE_NAME/log

杀掉服务的supervise进程

fuser -k /service/$SERVICE_NAME

删除supervise目录

rm /service/$SERVICE_NAME/{log/supervise,supervise}

由于一些服务的目录可能是symbolic link, 删除服务的目录并不会删除其下的supervise目录。因此这里先删除之。

删除服务对应的目录

rm /service/$SERVICE_NAME

恢复svscan进程的运行

pkill -CONT "^svscan$"

删除脚本

#!/bin/bash

if [ "`id -u`" != "`id -u root`" ]; then 
        echo "`whoami`: you need root priviledge to run this application. Invkoing sudo ..."
        exec sudo bash -c "$0 $@"
fi 

until [ -z "$1" ]; do
        case "$1" in
                *) [ "${1:0:1}" != "-" ] && break ;;
        esac
        shift
done

service_dir="/service/$@"

if [ -d "$service_dir" -a -x "$service_dir/run" ]; then
        pkill -STOP -f "^svscan$"

        if [ -d "$service_dir/log" ]; then
                svc -d $service_dir/log
                fuser -k $service_dir/log
                rm -rf $service_dir/log/supervise
        fi

        svc -d $service_dir
        fuser -k $service_dir &>/dev/null

        rm -rf $service_dir/supervise
        rm -rf $service_dir

        pkill -CONT -f "^svscan$"
else
        echo "Usage: $0 [service]"
        echo 
        echo "jianing-yang@alibaba-inc.com"
fi

Leave a Reply

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>