daemontools对服务的控制
通过 strace(1) daemontools的一些程序(svscan, svc, …), 可以简单了解daemontools对服务的控制方法。
- svscan 该进程会扫描(每5秒)/service目录,以确保每个对应的目录都有一个supervise来监控。
- 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