回到Linux基础系列文章大纲
回到Systemd系列文章大纲
回到Shell系列文章大纲
systemd时代的服务管理
使用systemd做服务管理时,需要了解一些基本知识:
- 了解systemd可管理哪些服务
- 了解systemd所管理服务的状态
- 了解systemctl管理服务的基本命令
- 学会编写、修改、看懂服务Unit配置文件
此处介绍前(3)点相关的内容,第(4)点内容较多,后面的文章再详细介绍。
systemd可管理哪些服务
操作系统使用systemd后,所有用户进程都是systemd的后代进程。
1 | $ pstree -p |
当某个进程不在某个绑定了终端的Shell进程下,该进程必然是脱离终端脱离Shell的Daemon类进程或其子孙进程。
虽然从进程树关系来看,所有进程都直接或间接地受到systemd的管理,但是,并非所有systemd的子进程都受Systemd Unit管理单元的管理。只有那些由systemd方式启动的服务进程(比如systemctl命令启动)才受到Systemd Unit管理单元的监控和管理。为了简化描述,后面均直接以『systemd管理』来描述受systemd unit管理单元的管理。
比如,用户可以通过下面两种方式启动Nginx服务进程:
1 | nginx # (1) |
但systemd只能监控、管理第(2)种方式启动的nginx服务。比如第一种方式启动的nginx,无法使用systemctl stop nginx
来停止。
所以,systemd下的直系子进程可分为两类:受systemd管理的子进程和不受systemd管理的子进程。
systemd管理服务的命令
注,下面这些命令可同时操作多个服务,且可对服务名称做模式匹配。
启动、停止服务:
1 | systemctl start Service_Name1 Service_Name2 |
服务重载、重启相关操作:
1 | # 重载服务:服务未运行时不做任何事 |
服务状态查看操作:
1 | # 查看服务状态 |
systemd所管理服务的状态说明
当使用systemd管理服务时,有必要了解服务的各种状态信息。
使用systemctl list-units --type=service
可以列出Service Unit的状态信息:
1 | $ systemctl list-units --type service |
使用systemctl status Service_Name
命令可以查看到服务的状态信息。
1 | $ systemctl status sshd |
第一项状态信息描述systemd是否在监控服务进程。可能的状态值有:
- active
- inactive
- activating或deactivating
- reloading
- failed
如果一个服务已经启动成功,它将成功加入到systemd监控队列(job queue),此后它将受到systemd监控和管理,此时该服务的状态为active
。
如果一个服务在启动过程中失败,比如负责服务启动的命令(ExecStart指令所指定)在启动时以非0退出状态码退出、服务启动过程耗时过久导致超时、进程崩溃等,此时该服务的状态将处于failed
状态,表示加入监控队列失败,事实上它加入到了某个描述启动失败的队列中。
当一个服务未启动,或者服务已停止时,该服务的状态将处于inactive
状态。
有些服务启动、停止可能会消耗一点时间,在启动或停止的过程中去查看服务的状态,看到的状态信息可能会是activating
或deactivating
或reloading
。
Active状态行的第二项状态信息描述被监控进程的进程状态。它可能的状态值有很多(部分机器如Ubuntu可使用systemctl --state=help
查看支持的值),且随着版本的更迭,支持的值也会发生变化。如下是ubuntu 18.04 systemd 237版本中查看到的值:
1 | dead |
虽然有很多种状态,但用户通常只需关注其中几项常见的即可。并且这些状态的存在通常都依赖于第一项active
状态,比如active(running)
、active(exited)
。
running
状态表明被systemd监控的服务进程正在运行。
dead
状态表明被systemd监控的进程已经死了(终结了),systemd识别到这种状态后就会将其从监控队列中释放并不再监控它,所以它的第一项状态也会随之变为inactive。以下几种情况都会使得服务进入dead状态:
exited
表明被systemd监控的服务进程已经退出了或者systemd找不到它本该要监控的进程,但是管理者systemd认为它还没有死,只是认为它暂时退出了,所以通常会结合active状态一起出现,即active(exited)
,这种状态表明了一种意愿:服务进程已经消失了,但依然认为服务进程是活动的且正被监控。例如,当服务配置文件中配置了RemainAfterExit=true
时,服务在退出后会进入active(exited)状态,还有多种其它可能会进入这种状态,通常来说意味着服务启动不正常(比如配置文件错误),但并非一定代表服务是失败的,它仍然可能会正常提供服务。
auto-restart
表明服务正在被systemd自动重启中,当服务配置文件设置了Restart
且符合Restart规则时systemd会自动重启服务。