分类: C/C++
2010-05-20 13:35:08
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进程) 还有几个其他的类似软件可供选择:,, |