本篇文章给大家谈谈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常驻进程 命令)
- CentOS 7 安装 daemontools
- daemontools 监控进程
- Django笔记 生产环境部署 gunicorn+nginx+supervisor c&b supervisor store supervisor piping superviso
- Django,nginx,gunicorn,supervisor:UnicodeEncodeError – 上传非拉丁文的命名文件
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
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 监控进程
一、学习的原因:
为了实现在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同样会重新启动程序。

- #include
- #include
- int main(){
- int ix = 0;
- for(;; ix++){
- printf("%d\n", ix);
- sleep(1);
- }
- return 0;
- }
注意:当停止再次启动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

- class demo{
- public static void main(String[] args) throws Exception{
- for(int i=0;;i++){
- System.out.println("i="+i);
- Thread.sleep(1000);
- }
- }
- }
javac -d . demo.java
vi run

- #!/bin/sh
- echo -e "start test";
- 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

- #!/bin/sh
- echo -e "start test2";
- 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文件,内容如下:

- #!/bin/sh
- TOMCAT_HOME=/var/tomcat6
- 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,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 – 上传非拉丁文的命名文件的相关知识,请在本站进行查询。
本文标签: