Contents

LinuxSys:linux进程管理

本文采用知识共享署名 4.0 国际许可协议进行许可,转载时请注明原文链接,图片在使用时请保留全部内容,可适当缩放并在引用处附上图片所在的文章链接。

Supervisor

介绍

SupervisorSupervisor: A Process Control System)是用Python开发的一个client/server服务,是Linux/Unix系统下的一个进程管理工具,不支持Windows系统。它可以很方便的监听、启动、停止、重启一个或多个进程。用Supervisor管理的进程,当一个进程意外被杀死,supervisort监听到进程死后,会自动将它重新拉起,很方便的做到进程自动恢复的功能,不再需要自己写bash脚本来控制。

安装

在Ubuntu中可以使用apt-get来安装:

1
sudo apt-get install supervisor

如果安装缓慢,可以更换中科大的源:

https://mirrors.ustc.edu.cn/help/ubuntu.html

配置

安装完成以后,我们需要编写一个配置文件,让supervisor来管理它。每个进程的配置文件都可以单独拆分,放在/etc/supervisor/conf.d/目录下,以.conf作为扩展名。

1
2
3
4
# 首先进入/etc/supervisor/conf.d目录
/etc/supervisor/conf.d
# 使用supervisor自带的命令生成模板
echo_supervisord_conf > foo.conf

编辑模板,在开头添加以下内容:

1
2
[program:foo]
command=/bin/cat

[program:app] : 定义进程app command : 命令 directory : 进程的当前目录 user : 进程运行的用户身份

详细配置说明:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
    ;*为必须填写项
    ;*[program:应用名称]
    [program:cat]
    
    ;*命令路径,如果使用python启动的程序应该为 python /home/test.py, 
    ;不建议放入/home/user/, 对于非user用户一般情况下是不能访问
    command=/bin/cat
    
    ;当numprocs为1时,process_name=%(program_name)s
    ;当numprocs>=2时,%(program_name)s_%(process_num)02d
    process_name=%(program_name)s
    
    ;进程数量
    numprocs=1
    
    ;执行目录,若有/home/supervisor_test/test1.py
    ;将directory设置成/home/supervisor_test
    ;则command只需设置成python test1.py
    ;否则command必须设置成绝对执行目录
    directory=/tmp
    
    ;掩码:--- -w- -w-, 转换后rwx r-x w-x
    umask=022
    
    ;优先级,值越高,最后启动,最先被关闭,默认值999
    priority=999
    
    ;如果是true,当supervisor启动时,程序将会自动启动
    autostart=true
    
    ;*自动重启
    autorestart=true
    
    ;启动延时执行,默认1秒
    startsecs=10
    
    ;启动尝试次数,默认3次
    startretries=3
    
    ;当退出码是0,2时,执行重启,默认值0,2
    exitcodes=0,2
    
    ;停止信号,默认TERM
    ;中断:INT(类似于Ctrl+C)(kill -INT pid),退出后会将写文件或日志(推荐)
    ;终止:TERM(kill -TERM pid)
    ;挂起:HUP(kill -HUP pid),注意与Ctrl+Z/kill -stop pid不同
    ;从容停止:QUIT(kill -QUIT pid)
    ;KILL, USR1, USR2其他见命令(kill -l),说明1
    stopsignal=TERM
    
    stopwaitsecs=10
    
    ;*以root用户执行
    user=root
    
    ;重定向
    redirect_stderr=false
    
    stdout_logfile=/a/path
    stdout_logfile_maxbytes=1MB
    stdout_logfile_backups=10
    stdout_capture_maxbytes=1MB
    stderr_logfile=/a/path
    stderr_logfile_maxbytes=1MB
    stderr_logfile_backups=10
    stderr_capture_maxbytes=1MB
    
    ;环境变量设置
    environment=A="1",B="2"
    
    serverurl=AUTO

启动

如果编辑默认的supervisor.conf,则需要重启supervisor使配置文件生效:

1
supervisorctl reload

然后运行下面的命令启动进程:

1
supervisorctl start foo

如果运行出现如下错误:

1
unix:///var/run/supervisor.sock no such file

可以运行下面的命令,然后再次启动:

sudo touch /var/run/supervisor.sock sudo chmod 777 /var/run/supervisor.sock sudo service supervisor restart

看到如下信息,说明运行成功:

foo: started

也可以输入supervisorctl进入supervisor的控制台界面,同样能够看到:

foo RUNNING pid 6665, uptime 0:08:08

在supervisor的控制台输入help可以获取帮助信息,输入status可以获取当前运行的进程信息,输入exit可以退出supervisor的控制台界面。

关闭

使用下面的命令就可以关闭supervisor启动的进程:

1
supervisorctl stop foo

可以看到输出信息:

foo: stopped

常用命令

更新新的配置到supervisord

1
supervisorctl update

重新启动配置中的所有程序

1
supervisorctl reload

启动某个进程(program_name=你配置中写的程序名称)

1
 supervisorctl start program_name

查看正在守候的进程(同时进入控制台)

1
supervisorctl

停止某一进程 (program_name=你配置中写的程序名称)

1
pervisorctl stop program_name

重启某一进程 (program_name=你配置中写的程序名称)

1
supervisorctl restart program_name

停止全部进程

1
supervisorctl stop all

Systemd

systemd 是一个 Linux 系统基础组件的集合,提供了一个系统和服务管理器,运行为 PID 1 并负责启动其它程序。功能包括:支持并行化任务;同时采用 socket 式与 D-Bus 总线式激活服务;按需启动守护进程(daemon);利用 Linux 的 cgroups 监视进程;支持快照和系统恢复;维护挂载点和自动挂载点;各服务间基于依赖关系进行精密控制。systemd 支持 SysV 和 LSB 初始脚本,可以替代 sysvinit。除此之外,功能还包括日志进程、控制基础系统配置,维护登陆用户列表以及系统账户、运行时目录和设置,可以运行容器和虚拟机,可以简单的管理网络配置、网络时间同步、日志转发和名称解析等。

systemd所管理的所有系统资源都称作Unit,通过systemd命令集可以方便的对这些Unit进行管理。比如systemctl、hostnamectl、timedatectl、localctl等命令,这些命令虽然改写了init时代用户的命令使用习惯(不再使用chkconfig、service等命令),但确实也提供了很大的便捷性。

systemd 特点

  • 最新系统都采用systemd管理(RedHat7,CentOS7,Ubuntu15…)
  • CentOS7 支持开机并行启动服务,显著提高开机启动效率
  • CentOS7关机只关闭正在运行的服务,而CentOS6,全部都关闭一次。
  • CentOS7服务的启动与停止不再使用脚本进行管理,也就是/etc/init.d下不在有脚本。
  • CentOS7使用systemd解决原有模式缺陷,比如原有service不会关闭程序产生的子进程。

systemd 语法

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
systemctl [command]      [unit](配置的应用名称)

command可选项
· start:启动指定的unit          systemctl start nginx
· stop:关闭指定的unit           systemctl stop nginx
· restart:重启指定unit          systemctl restart nginx
· reload:重载指定unit           systemctl reload nginx
· enable:系统开机时自动启动指定unit,前提是配置文件中有相关配置 systemctl enable nginx
· disable:开机时不自动运行指定unit   systemctl disable nginx
· status:查看指定unit当前运行状态 systemctl status nginx

systemd 配置文件说明

  • 每一个 Unit 都需要有一个配置文件用于告知 systemd 对于服务的管理方式
  • 配置文件存放于 /usr/lib/systemd/system/,设置开机启动后会在 /etc/systemd/system 目录建立软链接文件
  • 每个Unit的配置文件配置默认后缀名为.service
  • 在 /usr/lib/systemd/system/ 目录中分为 system 和 user 两个目录,一般将开机不登陆就能运行的程序存在系统服务里,也就是 /usr/lib/systemd/system
  • 配置文件使用方括号分成了多个部分,并且区分大小写

常用命令

列出各项启动占用的时间,但由于是并行启动,启动时间不决定启动完成先后

1
systemd-analyze blame

列出启动矢量图,用浏览器打开boot.svg文件 得到各service启动顺序

systemd-analyze plot > boot.svg

参考资料

systemd (简体中文) supervisor官方文档

Systemd 入门教程