Linux内核版本从3.10后开始使用systemd管理服务,这也是系统开机后的第一个服务。systemd通过unit单元文件来管理服务。
它保存了服务、设备、挂载点和操作系统其他信息的配置文件,并能够处理不同单元之间的依赖关系。大部分单元都静态的定义在单元文件中,也有一些是动态生成的。单元有多种状态:
-
处于活动的则是(active),当前正在运行
-
停止的则是(inactive),当前已经停止
-
启动中的则是(activing),当前正在启动
-
停止中的则是(deactiving),当前正在停止
-
失败的则是(failed)状态,意思说单元启动过程中遇到错误比如找不到文件、路径或者进程运行中崩溃了等。
单元类型如下:
单元类型 | 说明 |
service单元 | 用于封装一个后台服务进程,比如通过systemctl start firewalld启动防火墙,这种就属于service单元。 |
socket单元 | 用于封装一个后台服务进程,比如通过systemctl start firewalld启动防火墙,这种就属于service单元。 |
target单元 | 用于将多个单元在逻辑上组合在一起让它们同时启动。 |
device单元 | 用于封装一个设备文件,可用于基于设备启动。并不是每一个设备文件都需要一个device单元,但是每一个被udev规则标记的设备都必须作为一个device单元出现。 |
mount单元 | 用于封装一个文件系统挂载点(向后兼容/etc/fstab) |
automount单元 | 用于封装一个文件系统自动挂载点,只有该文件系统被访问时才会进行挂载,它取代了传统的autofs服务。 |
timer单元 | 用于封装一个基于时间触发的动作,它取代了atd、crond等计划任务。 |
swap单元 | 用于封装一个交换分区或者交换文件,它与mount类似。 |
path单元 | 用于根据文件系统上特定对象的变化来启动其他服务。 |
slice单元 | 用于控制特定的CGroup内所有进程的总体资源占有。 |
scope单元 | 它与service单元类似,但是由systemd根据D-bus接口接收到的信息自动创建,可用于管理外部创建的进程。 |
systemd能够处理各种依赖与冲突关系以及先后顺序,依赖与冲突、先后顺序两者之间是独立的。比如service1依赖service2,而且启动service1必须先启动service2,,那么这2个服务将会同时启动。
系统提供两种级别的单元:
-
系统单元:在/lib/systemd/system目录中,优先级高于用户单元。
-
用户单元:在/usr/lib/systemd/system目录中
查看所有系统单元
1 [root@jenkins mongodb]# systemctl list-unit-files 2 UNIT FILE STATE 3 proc-sys-fs-binfmt_misc.automount static 4 dev-hugepages.mount static 5 dev-mqueue.mount static
service文件说明
1、[unit]段:
设置管理启动顺序与依赖关系
Description=服务描述 | 给出当前服务的简单描述 |
Documentation=路径或url | 给出文档位置 |
After=服务.target或服务.service |
定义在某些服务之后启动。例如sshd服务启动必须在network.target sshd-keygen.service服务开启之后才能启动,可以使用如下命令查看sshd服务的配置 cat /usr/lib/systemd/system/sshd.service |
Before=服务.target | 定义在某些服务之前启动 |
Wants=服务.service | 弱依赖,表示等号填写服务启动或失败,不影响此配置文件服务的启动 |
Requires=服务.service | 设置此单元所必须依赖的其他单元。 当此单元被启动时,所有这里列出的其他单元也必须被启动。 如果有某个单元未能成功启动,那么此单元也不会被启动。 想要添加多个单元, 可以多次使用此选项, 也可以设置一个空格分隔的单元列表。 注意,此选项并不影响单元之间的启动或停止顺序。 想要调整单元之间的启动或停止顺序, 请使用 After= 或 Before= 选项。 例如,在 foo.service 中设置了 Requires=bar.service 但是并未使用 After= 或 Before= 设定两者的启动顺序, 那么,当需要启动 foo.service 的时候, 这两个单元会被并行的同时启动。 建议使用 Wants= 代替 Requires= 来设置单元之间的非致命依赖关系, 从而有助于获得更好的健壮性, 特别是在某些单元启动失败的时候。 |
2、[Install] 段:
这个段包含单元启动信息,只有单元状态为enable或者disabled才会用到这个段,这个段不能出现在单元的.d/*.conf配置文件中。
字段 | 说明 |
Alias= | 启用时使用的别名,可以设为一个空格分隔的别名列表。 每个别名的后缀(也就是单元类型)都必须与该单元自身的后缀相同。 如果多次使用此选项,那么每个选项所设置的别名都会被添加到别名列表中。 在启用此单元时,systemctl enable 命令将会为每个别名创建一个指向该单元文件的软连接。 注意,因为 mount, slice, swap, automount 单元不支持别名,所以不要在这些类型的单元中使用此选项。 |
WantedBy= RequiredBy= |
接受一个空格分隔的单元列表, 表示在使用 systemctl enable 启用此单元时, 将会在每个列表单元的 这个选项跟启动级别有关,通常设置的值为mult-user.targe 这是一个target,之后再讲,你只需要知道这相当于启动级别中的多用户默认。 |
Also= |
设置此单元的附属单元,可以设为一个空格分隔的单元列表。 表示当使用 systemctl enable 启用 或 systemctl disable 停用 此单元时, 也同时自动的启用或停用附属单元。如果多次使用此选项, 那么每个选项所设置的附属单元列表都会合并在一起。 |
DefaultInstance= | 仅对模板单元有意义, 用于指定默认的实例名称。 如果启用此单元时没有指定实例名称, 那么将使用这里设置的名称。 |
[Service]:设置启动行为
启动命令
字段 | 说明 |
ExecStart=命令 | 定义启动进程时执行的命令 |
ExecReload=命令 | 重启服务时执行的命令 |
ExecStop=命令 | 停止服务时执行的命令 |
ExecStartPre=命令 | 启动服务之前执行的命令 |
ExecStartPost=命令 | 启动服务之后执行的命令 |
ExecStopPost=命令 | 停止服务之后执行的命令 |
所有的启动设置之前,都可以加上一个连词号(-),表示"抑制错误",即发生错误的时候,不影响其他命令的执行。例如:ExecStop=-/bin/sh /server/scripts/xx.sh
启动类型 Type字段定义启动类型。它可以设置的值如下:
simple(默认值) | ExecStart字段启动的进程为主进程 |
forking | ExecStart字段将以fork()方式启动,此时父进程将会退出,子进程将成为主进程(后台运行) |
oneshot | 类似于simple,但只执行一次,Systemd 会等它执行完,才启动其他服务 |
dbus | 类似于simple,但会等待 D-Bus 信号后启动 |
notify | 类似于simple,启动结束后会发出通知信号,然后 Systemd 再启动其他服务 |
idl | 类似于simple,但是要等到其他任务都执行完,才会启动该服务。一种使用场合是为让该服务的输出,不与其他服务的输出相混合 |
service的其他一些字段
EnvironmentFile=文件路径 | 指定当前服务的环境参数文件 |
RestartSec=数值 | 表示Systemd重启服务之前,需要等待的秒数 |
PIDFile=PID文件路径 | PID进程文件 |
KillSignal=信号量 | 停止信号量,值一般为SIGQUIT |
TimeoutStopSec=数值 | 停止超时时间 |
PrivateTmp=布尔值 | 独立空间true或false,即文件系统名字空间的配置将被该命令行启动的进程忽略 |
[Install]:定义如何安装这个配置文件,即怎样做到开机启动
这个设置非常重要,如果设置开机自启动,在/etc/systemd/system目录下面的multi-user.target.wants子目录之中机会创建一个服务的软链接
WantedBy字段,表示该服务所在的 Targe,target的含义是服务组,表示一组服务,它可以设置的值如下
multi-user.target | 表示多用户命令行状态 |
graphical.target | 表示图形用户状态,它依赖于multi-user.target |
一个MongoDB的示例
[root@jenkins mongodb]# vim /usr/lib/systemd/system/mongod.service [Unit] Description="mongodb启动服务" After=network.target remote-fs.target nss-lookup.target [Service] Type=forking ExecStart=/data/module/mongodb/bin/mongod --config /data/module/mongodb/mongo.conf ExecReload=/bin/kill -s HUP $MAINPID ExecStop=/data/module/mongodb/bin/mongod --shutdown --config /data/module/mongodb/mongo.conf PrivateTmp=true [Install] WantedBy=multi-user.target