Linux下进程有时候会莫名的断掉,我在使用旧版MySQL Proxy的时候就时常被问题困恼,俗话说:不怕贼偷,就怕贼惦记着;进程断掉并不可怕,可怕的是没有任何先兆,稀里糊涂的就断了,究其原因,一来可能是误操作引起来的,二来可能是软件本身的BUG造成的,三来也可能是臭名昭著的OOM问题等等。最初我是使用
init的方法来解决这个问题的,不过那个方法稍显麻烦,下面介绍一下
daemontools:
# mkdir /package
# chmod 1755 /package
# cd /package
# wget http://cr.yp.to/daemontools/daemontools-0.76.tar.gz
# 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 http://www.qmail.org/moni.csi.hu/pub/glibc-2.3.1/daemontools-0.76.errno.patch
# 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 http://smarden.org/pape/djb/manpages/daemontools-0.76-man.tar.gz
# 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 http://download.lighttpd.net/lighttpd/releases-1.4.x/lighttpd-1.4.25.tar.gz
tar zxf lighttpd-1.4.25.tar.gz
cd lighttpd-1.4.25
./configure
make
make installsed -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确认,日志处理相关内容没有细说,在
官方faq基本都能找到答案。
常用操作:
# svstat /service/lighttpd(查看lighttpd状态)# svc -t /service/lighttpd(重启lighttpd进程)
# svc -u /service/lighttpd(启动lighttpd进程)# svc -d /service/lighttpd(停止lighttpd进程)还有几个其他的类似软件可供选择:
runit,
supervisord,
monit相关文档:
http://redmine.lighttpd.net/projects/lighttpd/wiki/InstallFromSourcehttp://redmine.lighttpd.net/wiki/lighttpd/lighttpdundersupervise
评论