彻底删除daemontools服务

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


No votes yet

发表新评论

此内容将保密,不会被其他人看见。 If you have a Gravatar account, used to display your avatar.
CAPTCHA
This question is for testing whether you are a human visitor and to prevent automated spam submissions.
Image CAPTCHA
Enter the characters shown in the image.