新闻类

微视,校宝,美食的俘虏-胎芽池全球新闻网


布景

常常碰到要跑一些看护进程。往常我的做法是开一个tmux软件或许screen,然后发动软件。假如有其他人问,我则会主张用

nohup your-program &>nohup.log &

这种办法。

但是这种做法究竟不是长久之计,机器重启或许不当心kill了某个进程,后台运转的这个进程或许就不当心死掉了。
后来开源界的大牛主张我用supervisor。测验之后,简直是如获至珍。作为一个存在了长达10年多的进程办理软件,他现已适当老练。到现在我用这个软件现已超越1年了,期望借这篇文章给咱们遍及下这个超赞的软件。

Supervisor 是一个客户端服务器体系,包括有两个程序

  1. Supervisor的server部分称为supervisord。首要担任办理子进程,呼应客户端的指令,log子进程的输出,创建和处理不同的事情

  2. Supervisor的指令行客户端supervisorctl。它能够与不同的supervisord进程进行通讯,获取子进程信息,办理子进程

supervisor的官网地址是 http://supervisord.org/ 我的大部分材料也是来自这儿。


长处

相比较传统的办法,supervisor用许多优点

简略

一般办理linux进程的时分,一般来说都需求自己编写一个能够完成进程start/stop/restart/reload功用的脚本,然后丢到/etc/init.d/下面。这么做有许多欠好的当地,榜首咱们要编写这个脚本,这就很耗时耗力了。第二,当这个进程挂掉的时分,linux不会主动重启它的,想要主动重启的话,咱们还要自己写一个监控重启脚本。而,supervisor则能够完美的处理这些问题。

进程组

supervisor能够对进程组统一办理,也就是说咱们能够把需求办理的进程写到一个组里边,然后咱们把这个组作为一个目标进行办理,如发动,中止,重启等等操作。而linux体系则是没有这种功用的,咱们想要中止一个进程,只能一个一个的去中止,要么就自己写个脚本去批量中止。

有效性

当supervisor的子进程挂掉的时分,操作体系会直接给supervisor发信号。而其他的一些相似supervisor的东西,则是经过进程的pid文件,来发送信号的,然后定时轮询来重启失利的进程。明显supervisor愈加高效。

装置

先从装置说起。

官网主张debain或许ubuntu 运用 apt-get 装置。 请注意,千万不要这么干 软件源的版别是3.0a8,这个版别有个坑爹的bug,stopasgroup这个设置没有用。

正确的装置办法, 装置完后版别应该 >= 3.1

sudo pip install -U supervisor
sudo echo_supervisord_conf > /etc/supervisord.conf

这个装备文件大部分都不必改,有个当地最好仍是改下

[include]
files = supervisor-conf.d/*.ini

然后mkdir /etc/supervisor-conf.d, 各个程序的装备都放到这个目录下。这样组织比较合理一些。

弄完后,发动服务端supervisord -c /etc/supervisord.conf。 接着运转sudo supervisorctl status ,假如没有报错,就阐明服务端发动正常了。

添加程序

首要需求预备一个装备文件(如hellod.ini)。放到 /etc/supervisor-conf.d/目录下。分号; 后边的是注释

文件的内容要遵从ini装备文件的标准。下面是个比如,这个比如基本上是通用的,需求改的部分只需上面4行

[program:hello]                 
directory=/home/codeskyblue/hello
command=python hello.py
user=codeskyblue
autostart=true
autorestart=true
redirect_stderr=true
stopsignal=TERM
stopasgroup=true

user代表运转的账户,program:hello, 其间hello是这个supervisor中的姓名,便利操控。
其间 stopasgroup代表的意思是 假如中止,将其相关的子进程也一同杀掉。

其实无妨写个shell脚本来生成装备文件,更快一些。贴上我写的一个生成装备的脚本。

#!/bin/sh
# gensvconf.sh

NAME=$(basename $PWD)
COMMAND=$@
USER=$(whoami)

cat > supervisor.ini <<EOF
[program:$NAME]
directory=$PWD
command=$COMMAND
user=$USER
autostart=true
autorestart=true
redirect_stderr=true
stopsignal=TERM
stopasgroup=true
EOF

hello.py的内容很简略

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys, time
n = 0
while True:
print >>sys.stdout, 'hello: %d' % n
sys.stdout.flush()
n += 1
time.sleep(1.0)

把生成的装备文件,复制曩昔,更新下supervisor的装备就好了。

cp supervisor.ini /etc/supervisor-conf.d/hello.ini
supervisorctl update
supervisorctl status # 检查hello是否正常运转

正常情况下应该会显现

hello                            RUNNING   pid 30096, uptime 0:02:30

还有一些其他的常用指令(这儿我默许你用root,所以我省去了sudo)

  1. supervisorctl tail hello 能够检查进程的输出

  2. supervisorctl reread hello 从头加载hello的装备

  3. supervisorctl remove hello 只要在hello中止运转的时分,才能够。这句是将hello从进程看护列表中移除

还有一个技巧,修正一个装备文件/etc/supervisor.conf的一个当地

[unix_http_server]
file=/var/run//supervisor.sock
chmod=0777 ; 原来是chmod=0700

改完之后,sudo supervisorctl reload 从头加载下装备。 这时在非root用户下,也能够自在的运用supervisorctl了

HTTP 服务

参加如下两行到/etc/supervisord.conf

[inet_http_server]
port = :9001

supervisorctl reload 从头加载装备。翻开浏览器输入 http://localhost:9001, 应该就会看到这个页面了,网页上的功用也很全。


作者:codeskyblue

来历:https://testerhome.com/topics/18649

相关文章