Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1476951
  • 博文数量: 463
  • 博客积分: 10540
  • 博客等级: 上将
  • 技术积分: 5450
  • 用 户 组: 普通用户
  • 注册时间: 2006-11-12 08:30
文章分类

全部博文(463)

文章存档

2014年(2)

2012年(14)

2011年(42)

2010年(18)

2009年(78)

2008年(35)

2007年(182)

2006年(92)

我的朋友

分类: C/C++

2010-05-20 13:35:08

daemontools让进程保持通话
 


Linux下进程有时候会莫名的断掉,我在使用旧版MySQL Proxy的时候就时常被问题困恼,俗话说:不怕贼偷,就怕贼惦记着;进程断掉并不可怕,可怕的是没有任何先兆,稀里糊涂的就断了,究其原因,一来可能是误操作引起来的,二来可能是软件本身的BUG造成的,三来也可能是臭名昭著的OOM问题等等。最初我是使用init的方法来解决这个问题的,不过那个方法稍显麻烦,下面介绍一下:

# mkdir /package
# chmod 1755 /package
# cd /package
# wget
# tar zxf daemontools-0.76.tar.gz
# rm -f daemontools-0.76.tar.gz
# cd admin/daemontools-0.76
# package/install


以上大体是按照官方手册介绍的安装步骤进行的,如果你的glibc库比较新,此时你很可能会遇到下面错误:

/usr/bin/ld: errno:
TLS definition in /lib/libc.so.6 section .tbss mismatches non-TLS reference in envdir.o
/lib/libc.so.6: could not read symbols: Bad value
collect2: ld returned 1 exit status
make: *** [envdir] Error 1
Copying commands into ./command...
cp: cannot stat `compile/svscan': No such file or directory


为了解决这个问题,接着上面的安装步骤继续:

# cd src
# wget
# patch < daemontools-0.76.errno.patch
# cd ..
# package/install


如果你对patch有恐惧感,也可以采取手动修改的方式:

# vi src/conf-cc

在最后加上 -include /usr/include/errno.h

缺省会安装到/usr/local/bin目录,最好加到PATH环境变量里。

接着安装man手册:

# wget
# tar zxf daemontools-0.76-man.tar.gz
# cd daemontools-man
# gzip *.8
# cp *.8.gz /usr/share/man/man8


这下安装应该成功了,你可以用下面命令确认:

# ps -ef | grep svscan
# man svscan


此时你查看一下inittab文件:

# cat /etc/inittab

会发现原来daemontools是使用init的方式来保护自己的:

SV:123456:respawn:/command/svscanboot

通过strace命令你能看到系统每隔五秒会核对一下服务:

# strace -p `pidof svscan`

daemontools最经典的搭配是和lighttpd一起使用,下面介绍一下:

先简单配置一个可运行的lighttpd,如果已经有了可以略过这段:

wget
tar zxf lighttpd-1.4.25.tar.gz
cd lighttpd-1.4.25
./configure
make
make install


sed -e 's/FOO/lighttpd/g' doc/rc.lighttpd > /etc/init.d/lighttpd

如果操作系统是CentOS或者RHEL:
sed -e 's/FOO/lighttpd/g' doc/rc.lighttpd.redhat > /etc/init.d/lighttpd


接着需要修改一下/etc/init.d/lighttpd文件中的执行路径指向,应该是:lighttpd="/usr/local/sbin/lighttpd",如果你安装在别的路径,可以通过type lighttpd命令确认。

chmod a+rx /etc/init.d/lighttpd
cp -p doc/sysconfig.lighttpd /etc/sysconfig/lighttpd
install -Dp ./doc/lighttpd.conf /etc/lighttpd/lighttpd.conf


按如下命令可以设置服务自动启动,不过我们就不设置了,自动启动的工作由daemontools帮我们完成:

chkconfig lighttpd on

如果操作系统是Debian或者Ubuntu:
update-rc.d lighttpd defaults

这样lighttpd就安装好了,可以用/etc/init.d/lighttpd start命令确认一下,确认成功后别忘了/etc/init.d/lighttpd stop掉相应的进程,因为我们下面要配置daemontools来管理lighttpd:

先建立标准的文件目录结构(如果操作系统是Gentoo,则用/var/services替代/srv):

/srv/lighttpd/           # the service directory
/srv/lighttpd/run        # the script that starts lighttpd
/srv/lighttpd/log/       # the service directory for the logger
/srv/lighttpd/log/run    # the script that starts the logger
/srv/lighttpd/log/main/  # log files go here


目录/srv/lighttpd-main/是755权限,下面的run脚本也是755,接着进行必要的设置:

注意:被保护的进程要运行在非daemon模式下,这样daemontools才能获得所有权去管理它,流行软件基本都有相应参数控制这个,比如apache是-DFOREGROUND参数,而在lighttpd里,就是-D参数。

文件:./run
#! /bin/sh
exec 2>&1
exec lighttpd -D -f /etc/lighttpd/lighttpd.conf


文件:./log/run
#! /bin/sh
umask 0027
exec setuidgid nobody multilog ./main


目录:./log/main/
chown nobody ./log/main/

最后一步:

ln -s /srv/lighttpd /service/

稍等片刻就能生效了,可以用ps -ef | grep supervise确认,日志处理相关内容没有细说,在基本都能找到答案。

常用操作:

# svstat /service/lighttpd(查看lighttpd状态)

# svc -t /service/lighttpd(重启lighttpd进程)
# svc -u /service/lighttpd
启动lighttpd进程
# svc -d /service/lighttpd停止lighttpd进程

还有几个其他的类似软件可供选择:,,
阅读(2652) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~