最近在用heartbeat构建一个高可用的nfs服务器,heartbeat的配置很顺利,一共也就需要修改三个配置文件。
通过heartbeat可以启动nfs服务,并且当一台机器down掉之后,nfs服务也可以切换到另一台机器上。
但是存在的一个问题是:运行heartbeat stop时,停止脚本无法完全终止nfs服务,系统中残留有nfsd进程,导致后续nfs服务的启动出现问题。
原因分析:
查看heartbeat的日志后发现,/etc/init.d/nfs stop脚本成功被调用,但是为什么nfsd没有被正常结束掉呢?
在/etc/init.d/nfs stop脚本中,发现如下的部分:
stop)
# Stop daemons.
echo -n $"Shutting down NFS mountd: "
killproc rpc.mountd
echo
echo -n $"Shutting down NFS daemon: "
killproc nfsd -2
其中nfsd是通过killproc 函数杀死的,并且传递了一个参数2;
进一步查看killproc函数的实现,发现后边的那个-2代表以哪种信号杀死nfsd进程,无参数时表示SIGKILL(也就是-9),而-2代表的信号是SIGINT。
可见问题就处在使用SIGINT信号无法结束掉nfsd进程。
问题的原因找到之后,那解决的方法就很简单了。
(1)删除nfs结束脚本中的-2
(2)在heartbeat的脚本中添加相关的进程结束脚本:
StopHA
`ps ax|grep nfsd|grep -v 'grep'|awk '{print $1}'|xargs -L 1 kill -9`
而用/etc/init.d/heartbeat start间接启动的nfsd,无法用killproc nfsd -2结束掉,这中间的原因尚不清楚