GVKun编程网logo

Daemontools 和 Supervisor 管理 linux 常驻进程(linux常驻进程 命令)

3

本篇文章给大家谈谈Daemontools和Supervisor管理linux常驻进程,以及linux常驻进程命令的知识点,同时本文还将给你拓展CentOS7安装daemontools、daemonto

本篇文章给大家谈谈Daemontools 和 Supervisor 管理 linux 常驻进程,以及linux常驻进程 命令的知识点,同时本文还将给你拓展CentOS 7 安装 daemontools、daemontools 监控进程、Django笔记 生产环境部署 gunicorn+nginx+supervisor c&b supervisor store supervisor piping superviso、Django,nginx,gunicorn,supervisor:UnicodeEncodeError – 上传非拉丁文的命名文件等相关知识,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

Daemontools 和 Supervisor 管理 linux 常驻进程(linux常驻进程 命令)

Daemontools 和 Supervisor 管理 linux 常驻进程(linux常驻进程 命令)

linux 主要使用 supervise 来管理常驻进程。基于 supervise 的两个比较重要的工具是 Daemontools 和 Supervisor。

实际上,supervise 也算 Daemontools 的一个工具。Daemontools 是 svscanboot,svscan,supervise,svc,svok,svstat 等一系列工具的合集。

安装

执行安装后,所有的命令都放到了 /command 目录,并软链到 /usr/local/bin/ 下面。

并且新建了 /service 目录来放置常驻脚本。

关系

安装完后,可以看到两个进程启动了。

root     19907  0.0 0.0 1936 508 ? Ss 17:12 0:00 /bin/sh /command/svscanboot root 19909 0.0 0.0 1880 376 ? S 17:12 0:00 svscan /service

svscanboot 启动 svscan 监视 /service 目录,svscan 则为 /service 的每个进程都启动一个 supervise 服务。

supervise s 执行./s/run,如果 s/down 文件存在,则需要使用 svc 手动启用。(机器重启的时候防止自动启用)

如果往 /service 下面加入服务脚本,则可以在后台看到下面的进程。

root@test2:/opt/tiger/graphite_client/tsar-client_run# ps aux|grep supervise root 3945 0.0 0.0 3932 40 ? S 2013 0:00 supervise location_search_8920 root 3946 0.0 0.0 3932 28 ? S 2013 0:00 supervise fenci_run root 3952 0.0 0.0 3932 76 ? S 2013 44:04 supervise tsar-client_run root 3953 0.0 0.0 3932 52 ? S 2013 0:00 supervise sentinel_run root 3954 0.0 0.0 3932 20 ? S 2013 0:00 supervise qiuzu_solr

supervise 的状态信息以 2 进制的形式存放在 s/supervise 下面,并且提供了下面的工具来操作:

  • svstat: 读取状态信息
  • svc: 启动 / 停止 / 挂起等
  • svok: 检查是否运行成功
  • svscan:可靠的启动 /service 目录下的服务。如果某个服务加入后,没有启动,可以调用此命令,强制启动。

加入一个新服务

最简单的方式是建立一个文件夹

testsvc
├── main.py └── run

写入文件内容:

yijingping@yjp-pc:~/testsvc$ cat main.py #!/usr/bin/python import time import logging while True: time.sleep(1) logging.info(''sleep 1 second'') logging.error(''sleep 1 second'') yijingping@yjp-pc:~/testsvc$ cat run #!/bin/sh exec ./main.py 1>/var/log/main.py.log 2>&1

然后在 /service 目录下建立软链接

$ sudo ln -s /path/to/testsvc

这个时候可以检查一下服务是否正在运行:

yijingping@yjp-pc:~$ sudo svstat /service/testsvc /service/testsvc: up (pid 4204) 962 seconds yijingping@yjp-pc:~$ ps aux|grep supervise root 4203 0.0 0.0 1716 248 ? S 09:37 0:00 supervise testsvc 1000 5631 0.0 0.0 3784 792 pts/3 S+ 09:54 0:00 grep supervise yijingping@yjp-pc:~$ tree /service/testsvc /service/testsvc ├── main.py ├── run └── supervise [error opening dir] 1 directory, 2 files

上面这种方式的坏处是必须以 root 用户运行,如果想以其他用户运行,则需要做如下改进,假设用户为 tiger,id 为 1001:

tigersvc
├── main.py ├── real_run └── run

文件内容:

tiger@yjp-pc:~/tigersvc$ cat run #!/bin/sh who=$(id -u) if [ $who -eq 0 ]; then exec /usr/local/bin/setuidgid tiger ./real_run elif [ $who -eq 1001 ];then exec ./real_run else echo "neither root nor tiger" fi tiger@yjp-pc:~/tigersvc$ cat real_run #!/bin/sh exec ./main.py 1>/var/log/tiger/main2.py.log 2>&1

加入服务后,查看后台进程以 tiger 为用户在运行:

yijingping@yjp-pc:/service$ ps aux|grep main.py tiger 24682 0.0 0.1 7052 3924 ? S 13:47 0:00 /usr/bin/python ./main.py

管理服务

使用 svstat 来查看服务

yijingping@yjp-pc:/service$ sudo svstat testsvc testsvc: down 20 seconds, normally up yijingping@yjp-pc:/service$ sudo svstat tigersvc tigersvc: up (pid 25046) 230 seconds

使用 svc 来管理服务

command mnemonic    signal  action
svc -u  up                  bring service up
svc -d down put service down (stays down) svc -o once run service once (don''t restart) svc -k kill SIGKILL send service KILL signal

如果要重启,必须先 svc -d s,再 svc -u s

其他工具

log 工具:

  • The readproctitle program
  • The multilog program
  • The tai64n program
  • The tai64nlocal program

环境工具:

  • The setuidgid program
  • The envuidgid program
  • The envdir program
  • The softlimit program
  • The setlock program

阅读原文

CentOS 7 安装 daemontools

CentOS 7 安装 daemontools

Daemontools是管理Unix服务的工具,它提供一组工具来管理一系列用户进程,当进程由于某些原因down掉之后,daemontools会自动重启进程

注意

被管理的进程不能以daemon形式运行,例如Nginx.conf 必须关闭daemon, daemon off;
不要在/service/建任何目录, /service/只存放一些symbol link
只需要完成安装 / 配置两步即可
安装

$ mkdir  ~/tools
$ cd /tools
$ wget http://cr.yp.to/daemontools/daemontools-0.76.tar.gz
$ tar xvzf daemontools-0.76.tar.gz
$ cd admin/daemontools-0.76
$ package/install

如果安装出现错误

/usr/bin/ld: errno: TLS defini  tion in /lib/libc.so.6 section .tbss mismatches non-TLS reference in envdir.o
将admin/daemontools-0.76/src/error.h中的extern int errno;替换为#include <errno.h>

安装完成之后,会创建 /service /command两个目录

启动daemontools

daemontools是一组service管理工具,其中svscanboot工具用来启动svscan工具。可以通过以下命令启动svscanboot

# /command/svscanboot &

也可以设置开机启动,具体参考

启动之后,查看进程,可以发现svscan做为svscanboot的子进程在运行

# ps -ef|grep svs  
root      9134  9072  0 04:05 pts/2    00:00:00 /bin/sh /command/svscanboot
root      9136  9134  0 04:05 pts/2    00:00:00 svscan /service

配置

启动svscanboot之后,相应的svscan进程也启动起来,其中参数/service/ 就是管理配置文件的目录

创建services目录,例如

# mkdir -p /opt/svc/{Nginx,tornado}

在services目录创建run脚本(名字必须是run而且权限是755),例如Nginx目录

#touch /opt/svc/Nginx/run  && chmod 755 /opt/svc/Nginx/run

#cat /opt/svc/Nginx/run
#!/bin/sh
exec /home/vagrant/Nginx/sbin/Nginx   #启动进程命令

创建symbol link, 创建完后daemontools会自动启动Nginx进程

#ln -s /opt/svc/Nginx/  /service/ 
#ln -s /opt/svc/tornado/  /service/ 

# pstree -a  -p 9134
svscanboot,9134 /command/svscanboot
  |-readproctitle,9137 service errors:...
  `-svscan,913      6 /service
      |-supervise,9138 Nginx
      |   `-Nginx,913       9
      |       `-Nginx,9140         
      `-supervise,9164      tornado
          `-python,9165 /home/vagrant/tornado/main.py

从中可以看出来,svscanboot负责启动svscan服务,svscan管理supervise进程。而具体的客户进程,是通过supervise进程来统一管理的

现在Nginx和tornado都被daemontool管理起来了,试试看杀掉tornado应用进程看看

root@precise32:/service# kill 9165
root@precise32:/service# !ps
ps -ef|grep tor
root          9164  9136  0 04:06 pts/2    00:00:00 supervise tornado
root          9181  9164  2 04:09 pts/2    00:00:00 python /home/vagrant/tornado/main.py

可以看到,虽然手动kill掉了tornado应用,但是daemontool自动将应用重新启动起来了

常用命令

启动被管理的进程 (配置完后无需执行svc命令)

svc -u /service/Nginx/  (启动之后,如果Nginx挂掉,daemontools会自动重启Nginx)

关闭被管理的进程(不会关闭daemontools supervise进程)

svc -d /service/Nginx/

查看service状态

svstat /service/Nginx/

移除service

rm  /service/Nginx   #移除软连接  
svc -dx /opt/svc/Nginx/

多嘴

问:咦,如果daemontools的进程挂掉了,该怎么办??
答:自个儿看文档,然后手动杀掉 svscanboot / svscan / supervisor 进程看看?

以上内容来自http://linbo.github.io/2013/02/24/daemontools

在CentOS 7上还需要进行些许改动,方法如下:

Cut’n’paste from http://www.productionmonkeys.net/guides/qmail-server/daemontools

CentOS 7 uses systemd

Create a new file /etc/systemd/system/daemontools.service,with the startup code in it:
新建一个文件 /etc/systemd/system/daemontools.service,内容如下:

[Unit]
Description=daemontools Start supervise
After=getty.target
[Service]
Type=simple
User=root
Group=root
Restart=always
ExecStart=/command/svscanboot /dev/ttyS0
TimeoutSec=0
[Install]
WantedBy=multi-user.target

Start the service,起动服务:

systemctl start daemontools.service

Test that it is running,测试是否运行:

systemctl status daemontools.service

Enable it to start at boot,设为开机启动:

systemctl enable daemontools.service

daemontools 监控进程

daemontools 监控进程

一、学习的原因:

      为了实现在tomcat服务异常停止运行后,有一个监控程序能监控到它,并自动重新启动这个tomcat。

二、工具supervise

      Daemontools是一个包含了很多管理Unix服务的工具的软件包。其中最核心的工具是supervise,它的功能是监控一个指定的服务,当该服务进程消亡,则重新启动该进程。而要添加让supervise监控的服务非常容易,只需要添加一个被监控的服务的目录,在该目录中添加启动服务器的名字为run的脚本文件即可。
    其中svscan工具是为指定的工作目录(缺省是/service/目录)下的所有子目录中的每一个子目录都启动一个supervise进程,最多可以启动多达1000个supervise进程(也就是工作目录下可以有多达1000个子目录)。其中每个子目录下都会有一个名为run的用来启动对应服务的脚本程序。Supervise会监控该服务,在服务消亡时使用run脚本来自动启动该服务。若svscan的工作目录下的子目录的sticky位被置位,则svscan将为该子目录启动两个supervise进程,一个监控子目录中的run对应的服务,另外一个监控子目录下的log子目录的记录服务,两者之间通过管道来相互联系。
    Svscan每5秒钟检测一次子目录,若出现新的目录则为该目录启动supervise,若某个老的子目录对应的supervise退出,则重新启动它。
    该软件包的所有工具的详细信息请参考在线文档。daemontools最经典的搭配是和lighttpd一起使用

 

三、安装

  /pacakage目录(你可以创建任意目录,这里使用package只是为了保持与英文作者的一致):  
  mkdir -p /package
  chmod 1755 /package
  cd /package

 

  下载daemontools-0.76.tar.gz到/package目录,解压该包。

       http://cr.yp.to/daemontools/daemontools-0.76.tar.gz  


  tar xvzf daemontools-0.76.tar.gz
  cd admin/daemontools-0.76

  编译并安装daemontools程序
  
  package/install

 【注意】:如果在安装过程中出现安装失败的提示,是因为daemontools 需要一个补丁daemontools-0.76.errno.patch这个补丁在qmail包中有。或者修改daemontools 源代码来修补这个bug

(修改方法:在src下的conf-cc文件的第一行最后添加如下代码即可  -include /usr/include/errno.h

     # vi src/conf-cc

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

 

如果安装成功,你可以用下面命令确认:

# ps -ef | grep svscan
# man svscan

 

此时你查看一下inittab文件:
    # cat /etc/inittab

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

    SV:123456:respawn:/command/svscanboot

     通过strace命令你能看到系统每隔五秒会核对一下服务:
    # strace -p `pidof svscan`


四、使用supervise程序进行程序管理监控

  supervise的执行命令是supervise Path ,其中Path 是指定路径,可以是相对路径,也可以是绝对路径。在Path路径下,必须有一个run的脚本,supervise调用的就是这个脚本,并监控管理该脚本中运行的程序。

  supervise的一个重要的功能就是可以检测出run脚本中执行的程序是否正常工作,若发现其已经死掉,supervise将会重新执行run脚本,重新启动指定程序。这对于很多服务端程序来说是十分必要的,没有人愿意在深夜2点的时候从被窝里爬出来重新启动服务器。

  下面是一个简单使用supervise的例子。

五、1)例子1

  假定已经安装好daemontools,建立一个test目录,进入该目录
  
  mkdir /temp1
  cd /temp1

  在该目录下写一个简单测试程序test.c:  

 

  编译test.c输出为test。  
  gcc -o test test1.c

 

  编写一个脚本run,来执行test程序,以便supervise进行调用。 


      #!/bin/sh  

      echo "start test!"  

      ./test

 

  退到上级目录,执行 supervise temp1看看效果:
  
  cd ..
  supervise temp1

  执行killall -9 test,杀死test进程,你会发现supervise会重新启动test进程。当然如果程序core dump,supervise同样会重新启动程序。

 

C代码   收藏代码
  1. #include   
  2. #include     
  3.   
  4. int main(){  
  5.      int ix = 0;   
  6.    for(;; ix++){    
  7.         printf("%d\n", ix);  
  8.             sleep(1);   
  9.    }   
  10.    return 0;   
  11. }   

  

注意:当停止再次启动supervise监控某目录时,会提示:

supervise: fatal: unable to acquire /service/test/supervise/lock: temporary failure

这时删除目录下的supervise重新监控即可。

   2)例子2 (java)

 

   命令: mkdir /service/test

              cd /service/test

               ll

               vi demo.java

              

Java代码   收藏代码
  1. class demo{  
  2.         public static void main(String[] args) throws Exception{  
  3.                 for(int i=0;;i++){  
  4.                         System.out.println("i="+i);  
  5.                         Thread.sleep(1000);  
  6.                 }  
  7.         }  
  8. }  

              javac -d . demo.java

              vi run

   

Xml代码   收藏代码
  1. #!/bin/sh  
  2.   
  3. echo -e "start test";  
  4. exec java demo  

            chmod +x run

    执行监控目录 :supervise /service/test

     [终端打印出来标号]

     再开启一个终端,查看正在执行这个命令的进程id,执行 ps -A

     找到 java这个进程的id号,

     执行 killall -9 java

     看前一个终端,是不是打印又从新开始了,呵呵。这说明中断之后supervise又启动这个进程了

 

   3)例子3

     mkdir  /tmp/test

      cd /tmp/test

      vi demo.java

      [代码同例子2]

      javac -d . demo.java

     vi run

    

Java代码   收藏代码
  1. #!/bin/sh  
  2.   
  3. echo -e "start test2";  
  4. exec java -classpath /tmp/test demo  

 

     chmod +x run

     ln -s /tmp/test  /service/test

     ll /service

     supervise /service/test

发现开始打印了,这时在另一个终端执行 killall -9 java ,则发现这个终端的打印又从新开始了,也就是杀掉进程之后立即又从新执行run了     

 

  4)实例4 监控tomcat启动

      假如tomcat 在redhat的 /var/tomcat6

    在/service目录下新建一个run文件,内容如下:

Java代码   收藏代码
  1. #!/bin/sh  
  2.   
  3. TOMCAT_HOME=/var/tomcat6  
  4. exec ${TOMCAT_HOME}/bin/catalina.sh run  

 

    执行supervise /service

    则发现tomcat启动了。

测试: 新打开一个终端,ps -ef |grep tomcat

找到tomcat的id,执行 kill -9 [tid]

杀掉了tomcat但在之前的终端窗口上却显示重新启动了tomcat。

【注】:好像用tomcat的./shutdown.sh命令不能使监控重启,出现异常,端口占用,可能是还没等tomcat关闭监控就执行了启动命令。

 

Django笔记 生产环境部署 gunicorn+nginx+supervisor c&b supervisor store supervisor piping superviso

Django笔记 生产环境部署 gunicorn+nginx+supervisor c&b supervisor store supervisor piping superviso

Django,nginx,gunicorn,supervisor:UnicodeEncodeError – 上传非拉丁文的命名文件

Django,nginx,gunicorn,supervisor:UnicodeEncodeError – 上传非拉丁文的命名文件

当我上传一些非拉丁名字的文件时,我得到错误:

UnicodeEncodeError at /profiles/ 'ascii' codec can't encode characters in position 39-41: ordinal not in range(128)

我已经尝试过更改主pipe环境, 在这里如何描述,但没有帮助。 我在/etc/supervisor/supervisord.conf中添加了这一行:

[supervisord] environment=LANG="ru_RU.utf8",LC_LANG="ru_RU.UTF-8",LC_ALL="ru_RU.UTF-8" logfile=/var/log/supervisor/supervisord.log ; (main log file;default $CWD/supervisord.log) pidfile=/var/run/supervisord.pid ; (supervisord pidfile;default supervisord.pid) childlogdir=/var/log/supervisor ; ('AUTO' child log dir,default $TEMP)

当我把这一行放在程序特定的conf文件中时,它也没有开始工作。

我试图找出我的编码,所以我已经添加到模板上下文这个variables:

国际化Django(在OSX上)

使用Django进行静态文件版本控制

Python 2.6.2,Django 1.0.3,Windows XP,找不到页面:/

Djangopipe理员后端“操作错误”试图写一个只读数据库

Django说所有图片都是无效的,但是PIL工作

context['locale'] = sys.getfilesystemencoding()

并在模板中显示“ANSI_X3.4-1968”

可以请一个人解释为什么改变环境没有解决问题?

谢谢。

用Nginx,django下载文件

gunicorn,Nginx(v 1.3.14),django和gevent-socket.io,在dotcloud

在Apache mod_python上部署django应用程序

Django芹菜socket.error:连接被拒绝

Django中的并发加载处理

确保你已经完全重新启动了supervisord,如下所述。 希望能帮助到你!

今天的关于Daemontools 和 Supervisor 管理 linux 常驻进程linux常驻进程 命令的分享已经结束,谢谢您的关注,如果想了解更多关于CentOS 7 安装 daemontools、daemontools 监控进程、Django笔记 生产环境部署 gunicorn+nginx+supervisor c&b supervisor store supervisor piping superviso、Django,nginx,gunicorn,supervisor:UnicodeEncodeError – 上传非拉丁文的命名文件的相关知识,请在本站进行查询。

本文标签: