最近工作中用到了daemontools工具来管理服务进程,再次总结下。
当服务进程因为某些原因(包括kill)挂掉了,daemontools会重新启动这个进程

环境介绍:
CentOS 6.9 x86_64位最小化安装

一、软件包下载安装过程

1.1下载软件包解压

[root@git-server ~]#wget http://cr.yp.to/daemontools/daemontools-0.76.tar.gz   
[root@git-server ~]# tar xf daemontools-0.76.tar.gz
[root@git-server ~]# cd admin/daemontools-0.76/

编辑src/conf-cc文件在文件后面加入-include /usr/include/errno.h 防止在后续编译安装过程中报错

[root@git-server daemontools-0.76]# vim src/conf-cc 
gcc -O2 -Wimplicit -Wunused -Wcomment -Wchar-subscripts -Wuninitialized -Wshadow -Wcast-qual -Wcast-align -Wwrite-strings -include /usr/include/errno.h

注意:下面的最后一条命令的package表示daemontools-0.76目录下的package目录,而不是一个package命令

1.2sudo编译安装

[root@git-server daemontools-0.76]#sudo package/install  
Linking ./src/* into ./compile...
Compiling everything in ./compile...
sh find-systype.sh > systype
rm -f compile
sh print-cc.sh > compile
chmod 555 compile
./compile byte_chr.c
。。。。。。。。
。。。。。。。。。
env - /bin/sh rts.tests 2>&1 | cat -v > rts
rm -f sysdeps
cat systype compile load >> sysdeps
grep sysdep direntry.h >> sysdeps
grep sysdep haswaitp.h >> sysdeps
grep sysdep hassgact.h >> sysdeps
grep sysdep hassgprm.h >> sysdeps
grep sysdep select.h >> sysdeps
grep sysdep uint64.h >> sysdeps
grep sysdep iopause.h >> sysdeps
grep sysdep hasmkffo.h >> sysdeps
grep sysdep hasflock.h >> sysdeps
grep sysdep hasshsgr.h >> sysdeps
copying commands into ./command...
Creating symlink daemontools -> daemontools-0.76...
Making command links in /command...
Making compatibility links in /usr/local/bin...
Creating /service...
Adding svscanboot to inittab...
init should start svscan Now.

查看inittab,在文件末尾可以看到这一行:
[root@git-server daemontools-0.76]# tail -1 /etc/inittab 
SV:123456:respawn:/command/svscanboot

之所以要使用sudo是因为,install脚本会在根目录/下创建两个目录:/service和/command目录。
其中/service目录用来存放被daemontools管理的进程.
注意在/service目录下存放的只能是连接。
/command命令下存放的是daemontools的一些常用命令。

二、配置daemontools

配置启动项,把 csh -cf '/command/svscanboot &' 加入到 /etc/rc.local=>/etc/rc.d/rc.local 末尾:开机自启动

[root@git-server command]# sed -i '$acsh -cf \x27\/command\/svscanboot &\x27' /etc/rc.local
[root@git-server command]# tail -2 /etc/rc.local 
csh -cf '/command/svscanboot &'

[root@git-server command]# sh  /etc/rc.local
/etc/rc.local: line 15: csh: command not found

报错,于是安装csh命令

[root@git-server command]# yum install tcsh  -y
[root@git-server command]# which tcsh
/bin/tcsh
[root@git-server command]# which csh
/bin/csh

再次安装成功:

[root@git-server command]# sh -x /etc/rc.local 
+ bash /var/lib/subsys/local
+ csh -cf '/command/svscanboot &'
[1] 13689
[root@git-server command]# 
[root@git-server command]# ps -ef|grep svs
root     13689     1  0 22:55 pts/3    00:00:00 /bin/sh /command/svscanboot
root     13694 13689  0 22:55 pts/3    00:00:00 svscan /service
root     13768  9451  0 22:55 pts/3    00:00:00 grep --color svs

或者是直接后台运行

[root@git-server service]# /command/svscanboot &
[root@git-server service]# ps -ef|grep svs
root      1044  7763  0 22:37 pts/2    00:00:00 grep --color svs
root     30451  9451  0 22:34 pts/3    00:00:00 /bin/sh /command/svscanboot
root     30458 30451  0 22:34 pts/3    00:00:00 svscan /service

从ps -ef | grep svs的输出可以看到svscan作为svscanboot的子进程在运行。而且svscan监听的目录是/service目录。

三、daemontools的简单介绍

daemontools是一个守护进程工具,防止用户进程意外退出。daemontools的工具有如下截图:

3.1、常用的命令介绍:

(1)svscanboot
这个命令一般不用手动输入执行,因为这个一般会随Linux系统的启动而自动启动。于是加入开启自启动:/etc/rc.local就可以直到它会随Linux的启动而启动。
svscanboot启动之后会启动svscan,svscan会启动supervise,supervise会启动并监听/service中存放服务目录下的run可执行文件。

(2)svscan
svscan会为/service目录下所有服务启动supervise进程。svscan会为每个服务启动一对supervise服务:一个s子目录(即服务进程的工程目录),其实是个软连接;一个是s子目录下的log目录(如果有的话)。supervise会执行s子目录下的run脚本,并监听run脚本启动的进程,同时会启动s/log目录下的run脚本。这个s/log目录下的run脚本用来输出s目录run脚本的日志到指定目录。svscan每隔5s检查下/service目录,如果有新的服务,则启动新的supervise;如果有supervise意外退出会重新启动supervise。
(3)supervise
supervise用来执行/service目录下服务的run脚本。如果run脚本退出的话,会每隔几秒执行一下。在/service下的服务目录s下会有一个supervise目录用来存放进程状态的二进制格式信息。svstate就会读取这个状态信息

[root@git-server Nginx]# svstat /service/Nginx
/service/Nginx: up (pid 19169) 0 seconds
[root@git-server Nginx]#

(4)svc命令
svc opts services
opts是一系列的参数,services是指/service下的服务目录。opts参数如下:
-u : up,如果services没有运行的话,启动它,如果services停止了,重启它。
-d : down,如果services正在运行的话,给它发送一个TERM(terminate)信号,然后再发送一个CONT(continue)信号,在它停止后,不再启动它。
-o : once,如果services没有运行,启动它,但是在它停止后不再启动了。就是只运行一次。
-p : pause,给services发送一个停止信号。
-c : continue,给services发送一个CONT信号。
-h : hang up, 给services发送一个HUP信号。
-a : alarm, 给services发送一个ALRM信号。
-i : interrupt, 给services发送一个INT信号。
-t : Terminate,给services发送一个TERM信号。
-k : kill,给services发送一个KILL信号。
-x : exit,supervise在services停止后会立刻退出, 但是值得注意的是,如果你在一个稳定的系统中使用了这个选项,你已经开始犯错了:supervise被设计成为永远运行的。
关掉一个服务进程通常使用-dk参数,此时supervise进程并没有关闭,所以依然可以将这个服务进程重启。即使,supervice进程挂掉了,svscan依然会重启supervise,supervise会重新运行服务进程的run脚本。

Interface svc opts services 
opts is a series of getopt-style options. services consists of any number of arguments,each argument naming a directory used by supervise. 
svc applies all the options to each service in turn. Here are the options: 
-u: Up. If the service is not running,start it. If the service stops,restart it. 
-d: Down. If the service is running,send it a TERM signal and then a CONT signal. After it stops,do not restart it. 
-o: Once. If the service is not running,start it. Do not restart it if it stops. 
-p: Pause. Send the service a STOP signal. 
-c: Continue. Send the service a CONT signal. 
-h: Hangup. Send the service a HUP signal. 
-a: Alarm. Send the service an ALRM signal. 
-i: Interrupt. Send the service an INT signal. 
-t: Terminate. Send the service a TERM signal. 
-k: Kill. Send the service a KILL signal. 
-x: Exit. supervise will exit as soon as the service is down. If you use this option on a stable system,you’re doing something wrong; supervise is designed to run forever.

(5)svstat

[root@git-server service]# ps -ef|grep svs
root     13689     1  0 22:55 pts/3    00:00:00 /bin/sh /command/svscanboot
root     13694 13689  0 22:55 pts/3    00:00:00 svscan /service
root     21765  7763  0 23:06 pts/2    00:00:00 grep --color svs
查看服务的状态:
[root@git-server Nginx]# svstat /service/Nginx
/service/Nginx: up (pid 19169) 0 seconds

四、举例演示:

配置一个服务非常简单:
1) 创建一个目录,目录下放一个run脚本
2) run脚本执行启动服务的命令
3) 建立/service下一个链接

[root@git-server service]# mkdir /data/Nginx -p
[root@git-server service]# cat /data/Nginx/run 
#!/bin/bash
exec service Nginx start

停止Nginx服务
[root@git-server Nginx]# service Nginx stop

[root@git-server service]# chmod +x /data/Nginx/run 
[root@git-server service]# ln -sv /data/Nginx /service/Nginx
`/service/Nginx' -> `/data/Nginx'

神奇的就是最后一句,一旦创建了链接,daemontools就会自动帮你启动Nginx服务了。刚才停掉的Nginx服务,然后服务是否又被启动了:
如下图:

停止对服务的监控:

[root@git-server service]# svc -d /service/Nginx
[root@git-server service]# svstat /service/Nginx
/service/Nginx: down 213 seconds,normally up
停止Nginx服务后,Nginx服务不再被重启
[root@git-server Nginx]# service Nginx stop

如果不再需要daemontools守护某服务,可完成上述操作后,将/service下的对应目录删除。
服务所在目录/service

开启对Nginx服务的监控:

[root@git-server service]# svc -u /service/Nginx
[root@git-server service]# svstat /service/Nginx
/service/Nginx: up (pid 23563) 1 seconds

Nginx服务再次被启动

[root@git-server Nginx]# ps -ef|grep Nginx
root     13695 13689  0 22:55 pts/3    00:00:00 readproctitle service errors: ...dy running.?Starting Nginx... Nginx (pid 23367 23366 23365 23364 23363) already running.?Starting Nginx... Nginx (pid 23367 23366 23365 23364 23363) already running.?Starting Nginx... Nginx (pid 23367 23366 23365 23364 23363) already running.?Starting Nginx... Nginx (pid 23367 23366 23365 23364 23363) already running.?Starting Nginx... Nginx (pid 23367 23366 23365 23364 23363) already running.?
root     13741 13694  0 22:55 pts/3    00:00:00 supervise Nginx
root     23363     1  0 23:19 ?        00:00:00 Nginx: master process /usr/local/Nginx/sbin/Nginx -c /usr/local/Nginx/conf/Nginx.conf
www      23364 23363  0 23:19 ?        00:00:00 Nginx: worker process                                          
www      23365 23363  0 23:19 ?        00:00:00 Nginx: worker process                                          
www      23366 23363  0 23:19 ?        00:00:00 Nginx: worker process                                          
www      23367 23363  0 23:19 ?        00:00:00 Nginx: worker process                                          
root     23820  9451  0 23:20 pts/3    00:00:00 grep --color Nginx

演示到此结束,很简单吧,伙伴们一看就会。

CentOS6.9安装daemontools工具管理服务进程的更多相关文章

  1. Android BLE onCharacteristicRead和onCharacteristicChanged从未调用过

    此代码包含在我的MainActivity方法中.不确定这是否会有所作为.我已经看过并尝试了几种方法,但没有运气.更新:我决定检查onDescriptorWrite方法并记录一些信息.有趣的是,状态返回13,即“写入操作超过属性的最大长度”.我将进一步研究这个问题.解决方法我在这里发现了问题.我假设温度计正在使用标准的BLE服务和特性设置.它不是.他们创造了自己的自定义特征.一旦我切换到那个特性,’改变’方法开始射击.

  2. 如何在我的Android中运行BASH脚本?

    我的BASH脚本在Fedora/CentOS中工作.但是我正在测试一个Androideeepad变压器.我有终端访问,我写了一个小测试脚本.但它不工作,我该如何解决?我究竟做错了什么?我看到,虽然它被指定#!/bin/bash错误由sh发布–可能会做错了.UPD

  3. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. Vue项目打包并部署nginx服务器的详细步骤

    vue项目开发好之后需要部署到服务器上进行外网访问,下面这篇文章主要给大家介绍了关于Vue项目打包并部署nginx服务器的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下

  5. ubuntu中利用nginx部署vue项目的完整步骤

    Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行,下面这篇文章主要给大家介绍了关于ubuntu中利用nginx部署vue项目的相关资料,需要的朋友可以参考下

  6. 使用Node.js配合Nginx实现高负载网络

    这篇文章主要介绍了使用Node.js配合Nginx实现高负载网络,Node的异步加上Nginx的反向代理在性能上实在是给力!需要的朋友可以参考下

  7. CentOS 7.2 下编译安装PHP7.0.10+MySQL5.7.14+Nginx1.10.1的方法详解(mini版本)

    这篇文章主要介绍了CentOS 7.2 mini版本下编译安装PHP7.0.10+MySQL5.7.14+Nginx1.10.1的方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下

  8. Symfony2在Nginx下的配置方法图文教程

    这篇文章主要介绍了Symfony2在Nginx下的配置方法,结合图文形式较为详细的分析了Symfony2在Nginx下的配置方法与具体操作步骤,需要的朋友可以参考下

  9. windows7配置Nginx+php+mysql的详细教程

    这篇文章主要介绍了windows7配置Nginx+php+mysql的详细教程 的相关资料,需要的朋友可以参考下

  10. 一文教会你用nginx+uwsgi部署自己的django项目

    uWSGI是一个Web服务器,它实现了WSGI协议、uwsgi、http等协议,下面这篇文章主要给大家介绍了关于用nginx+uwsgi部署自己的django项目的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下

随机推荐

  1. 在airgapped(离线)CentOS 6系统上安装yum软件包

    我有一个CentOS6系统,出于安全考虑,它已经被空气泄漏.它可能从未连接到互联网,如果有,它很长时间没有更新.我想将所有.rpm软件包放在一个驱动器上,这样它们就可以脱机安装而无需查询互联网.但是,我在测试VM上遇到的问题是,即使指定了本地路径,yum仍然会挂起并尝试从在线存储库进行更新.另外,有没有办法使用yum-utils/yumdownloader轻松获取该包的所有依赖项和所有依赖项?目前

  2. centos – 命名在日志旋转后停止记录到rsyslog

    CentOS6.2,绑定9.7.3,rsyslog4.6.2我最近设置了一个服务器,我注意到在日志轮换后,named已停止记录到/var/log/messages.我认为这很奇怪,因为所有日志记录都是通过rsyslog进行的,并且named不会直接写入日志文件.这更奇怪,因为我在更新区域文件后命名了HUPed,但它仍然没有记录.在我停止并重新启动命名后,记录恢复.这里发生了什么?

  3. centos – 显示错误的磁盘大小

    对于其中一个磁盘,Df-h在我的服务器上显示错误的空白区域:Cpanel表明它只有34GB免费,但还有更多.几分钟前,我删除了超过80GB的日志文件.所以,我确信它完全错了.fdisk-l/dev/sda2也显示错误:如果没有格式化,我该怎么做才能解决这个问题?并且打开文件描述符就是它需要使用才能做到这一点.所以…使用“lsof”并查找已删除的文件.重新启动写入日志文件的服务,你很可能会看到空间可用.

  4. 如何在centos 6.9上安装docker-ce 17?

    我目前正在尝试在centOS6.9服务器上安装docker-ce17,但是,当运行yuminstalldocker-ce时,我收到以下错误:如果我用跳过的标志运行它我仍然得到相同的消息,有没有人知道这方面的方法?

  5. centos – 闲置工作站的异常负载平均值

    我有一个新的工作站,具有不寻常的高负载平均值.机器规格是:>至强cpu>256GB的RAM>4x512GBSSD连接到LSI2108RAID控制器我从livecd安装了CentOS6.564位,配置了分区,网络,用户/组,并安装了一些软件,如开发工具和MATLAB.在启动几分钟后,工作站负载平均值的值介于0.5到0.9之间.但它没有做任何事情.因此我无法理解为什么负载平均值如此之高.你能帮我诊断一下这个问题吗?

  6. centos – Cryptsetup luks – 检查内核是否支持aes-xts-plain64密码

    我在CentOS5上使用cryptsetupluks加密加密了一堆硬盘.一切都很好,直到我将系统升级到CentOS6.现在我再也无法安装磁盘了.使用我的关键短语装载:我收到此错误:在/var/log/messages中:有关如何装载的任何想法?找到解决方案问题是驱动器使用大约512个字符长的交互式关键短语加密.出于某种原因,CentOS6中的新内核模块在由旧版本创建时无法正确读取512个字符的加密密钥.似乎只会影响内核或cryptsetup的不同版本,因为在同一系统上创建和打开时,512字符的密钥将起作用

  7. centos – 大量ssh登录尝试

    22个我今天登录CentOS盒找到以下内容这是过去3天内的11次登录尝试.WTF?请注意,这是我从我的提供商处获得的全新IP,该盒子是全新的.我还没有发布任何关于此框的内容.为什么我会进行如此大量的登录尝试?是某种IP/端口扫描?基本上有4名匪徒,其中2名来自中国,1名来自香港,1名来自Verizon.这只发生在SSH上.HTTP上没有问题.我应该将罪魁祸首子网路由吗?你们有什么建议?

  8. centos – kswap使用100%的CPU,即使有100GB的RAM也可用

    >Linux内核是否应该足够智能,只需从内存中清除旧缓存页而不是启动kswap?

  9. centos – Azure将VM从A2 / 3调整为DS2 v2

    我正在尝试调整前一段时间创建的几个AzureVM,从基本的A3和标准A3到标准的DS2v2.我似乎没有能力调整到这个大小的VM.必须从头开始重建服务器会有点痛苦.如果它有所不同我在VM中运行CentOS,每个都有一个带有应用程序和操作系统的磁盘.任何人都可以告诉我是否可以在不删除磁盘的情况下删除VM,创建新VM然后将磁盘附加到新VM?

  10. centos – 广泛使用RAM时服务器计算速度减慢

    我在非常具体的情况下遇到服务器速度下降的问题.事实是:>1)我使用计算应用WRF>2)我使用双XeonE5-2620v3和128GBRAM(NUMA架构–可能与问题有关!

返回
顶部