supervisor是用Python开发的Linux/Unix系统下的一个进程管理工具。可以很方便的监听、启动、停止、重启一个或多个进程。用supervisor管理的进程,当一个进程意外被杀死,supervisor监听到进程死后,会自动将它重启,很方便的做到进程自动恢复的功能,不再需要自己写shell脚本来控制。

1.安装

python3 -m pip install supervisor

安装好后会多处下面几个命令

echo_supervisord_conf //配置表生成工具
supervisord //supervisor 主程序
supervisorctl //supervisor 管理工具

2.配置

mkdir -p /etc/supervisor
echo_supervisord_conf > /etc/supervisor/supervisord.conf // 生成配置文件

多配置文件模式

在 supervisord.conf 配置文件末尾有个 include 段,files 所匹配到的配置文件会被组合进来传递给 supervisord ,这样就可以分离主程序的配置。

[include]
files = /etc/supervisor/conf.d/*.conf

3.启动

supervisord -c /etc/supervisor/supervisord.conf

4.管理

在 supervisor 管理模式下可以控制进程的启动,重启,停止等操作。支持命令行和web两种方式,使用默认配置文件执行命令 supervisorctl 就可以进入管理模式。要进入web管理模式需要修改配置文件 supervisord.conf 去掉 inet_http_server 段的注释,重启 supervisor 即可。

;[inet_http_server]         ; inet (TCP) server disabled by default
;port=127.0.0.1:9001        ; ip_address:port specifier, *:port for all iface
;username=user              ; default is no username (open server)
;password=123               ; default is no password (open server)

QQ20190917-102530.png

supervisorctl 命令行控制

supervisorctl status  查看所有spawn进程的状态
supervisorctl stop xxx,停止某一个进程(xxx),xxx为[program:xxx]里配置的值
supervisorctl start xxx,启动某个进程
supervisorctl restart xxx,重启某个进程
supervisorctl stop groupworker: ,重启所有属于名为groupworker这个分组的进程(start,restart同理)
supervisorctl stop all,停止全部进程,注:start、restart、stop都不会载入最新的配置文件。
supervisorctl reload,载入最新的配置文件,停止原有进程并按新的配置启动、管理所有进程。
supervisorctl update,根据最新的配置文件,启动新配置或有改动的进程,配置没有改动的进程不会受影响而重启
注意:显示用stop停止掉的进程,用reload或者update都不会自动重启。

5.添加要管理的进程

在 supervisord.conf 末尾新增 或者 [include] 段指定的配置文件中新增都是可以的。

[program:<随便起的名字>]
command=/bin/cat // 命令行
;directory=/tmp // 进程启动的当前目录
autostart=true // supervisord 启动的时候也一起启动
startsecs=5 // 进程必须撑住 5秒不退出才算启动成功
autorestart=true // 程序异常启动后自动重启
startretries=3 // 启动失败后重试的次数

6.例子

[program:frp]
command=frps -c /etc/frp/frps.ini
directory=/etc/frp/
autostart=true
autorestart=true

[program:frps] ; 最简配法,都使用默认值即可
command=frps -c /etc/frp/frps.ini
; autostart=true 默认 true
; autorestart=true 默认 true

参考链接:
https://blog.51cto.com/lixcto/1539136
https://blog.51cto.com/lixcto/1540169

data = blob <data length>\x00<data>
hash = sha1(data)
data = zlib(data)

write(hash[:2] + "/" hash[2:], data)

blob
tree
commit 都类似

import sqlite3

db = sqlite3.connect(':memory:') # :memory: 表示数据保存在内存中

db.execute("CREATE TABLE data (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, value INTEGER)");

db.execute("INSERT INTO data (id, name, value) VALUES (?, ?, ?)", (1, '猫了个咪', 666));

cursor = db.execute("SELECT * FROM data");
print(cursor.fetchone())
cursor.execute("SELECT * FROM data")
print(cursor.fetchone())
cursor = db.cursor();
print(cursor.fetchone())
cursor.execute("SELECT * FROM data")
print(cursor.fetchone())

db.commit() # 事务提交 (启用事务才需要使用这个命令)

流程

  1. 客户端开启 ssh-agent
  2. 增加key到 agent 中
  3. 客户端配置 ~/.ssh/config 允许 agent 转发出去
  4. 服务端配置 /etc/ssh/sshd_config 接受客户端转发过来的 agent

配置服务端转发 (需要重启sshd)

/etc/ssh/sshd_config

AllowAgentForwarding yes

配置客户端转发

~/.ssh/config (/etc/ssh/ssh_config)

Host gitee.com
    ForwardAgent yes

ssh agent 配置

启动 ssh-agent

eval `ssh-agent`

添加 key 到 ssh-agent (默认添加当前账户下的几个默认key)

ssh-add 

列出已经添加到 ssh-agent 中的key

ssh-add -l