systemctl命令和配置整理

[TOC]

systemctl与service的区别

Linux 服务管理的两种方式 servicesystemctlsystemctl 基本上是的更强大的版本 service

service

service 命令其实是去/etc/init.d 目录下,去执行相关程序,init.d 目录包含许多系统各种服务的启动和停止脚本。当 Linux 启动时,会寻找这些目录中的服务脚本,并根据脚本的 run level 确定不同的启动级别。

systemctl

systemctl 命令主要负责控制 systemd 系统和服务管理器。在 ubuntu、centos 等一系列发行版中可用。可以方便的管理需要启动的服务等。可以实现开机自启动、出错重启和定时重启等等功能。

systemctl命令

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
# 启动
systemctl start name.service
# 停止
systemctl stop name.service
# 重启
systemctl restart name.service
# 查看状态
systemctl status name.service
# 禁止自动和手动启动
systemctl mask name.service
# 取消禁止
systemctl unmask name.service
# 查看某服务当前激活与否的状态:
systemctl is-active name.service
# 查看所有已经激活的服务:
systemctl list-units --type service
# 查看所有服务:
systemctl list-units --type service --all
# 设定某服务开机自启,相当于chkconfig name on
systemctl enable name.service
# 设定某服务开机禁止启动:相当于chkconfig name off
systemctl disable name.service
# 查看所有服务的开机自启状态,相当于chkconfig --list
systemctl list-unit-files --type service
# 用来列出该服务在哪些运行级别下启用和禁用:chkconfig –list name
ls /etc/systemd/system/*.wants/name.service
# 查看服务是否开机自启:
systemctl is-enabled name.service
# 列出失败的服务
systemctl --failed --type=service
# 开机并立即启动或停止
systemctl enable --now postfix
systemctl disable --now postfix
# 查看服务的依赖关系:
systemctl list-dependencies name.service
# 杀掉进程:
systemctl kill unitname
# 重新加载配置文件
systemctl daemon-reload
# 关机
systemctl halt
systemctl poweroff
# 重启:
systemctl reboot
# 挂起:
systemctl suspend
# 休眠:
systemctl hibernate
# 休眠并挂起:
systemctl hybrid-sleep

服务单元文件目录

  • /usr/lib/systemd/system/:每个服务最主要的启动脚本的配置放在这,有点类似以前的/etc/init.d
  • /run/systemd/system/:系统执行过程中所产生的服务脚本所在目录,这些脚本的优先级要比/usr/lib/systemd/system/高;
  • /etc/systemd/system/:管理员根据主机系统的需求所创建的执行脚本所在目录,执行优先级比/run/systemd/system/

服务单元文件类型

.service(一般服务类型):主要是系统服务,包括服务器本身所需要的本机服务以及网络服务,比较经常被使用到的服务大多是这种类型,是最常见的类型;

.socket(内部程序数据交换的插槽服务):使用 socket 类型的服务一般是比较不会被用到的服务,因此在开机时通常会稍微延迟启动的时间。一般用于本机服务比较多,例如我们的图形界面很多的软件都是通过 socket 来进行本机程序数据交换的行为;

.target(执行环境类型):其实是一群unit的集合,例如 multi-user.target 其实就是一堆服务的集合;

.mount(文件系统挂载相关的服务):例如来自网络的自动挂载、NFS文件系统挂载等与文件系统相关性较高的程序管理;

.path(监测特定文件或目录类型):某些服务需要监测某些特定的目录来提供序列服务,例如最常见的打印服务,就是通过监测打印序列目录来启动打印功能,这时就得要 .path 的服务类型支持;

.timer(循环执行的服务):这个东西有点类似 anacrontab,不过是由systemd主动提供的,比 anacrontab 更加有弹性。

服务单元文件格式

  1. [Unit]:定义与Unit类型有关的通用选项,用于提供 Unit 的描述信息、Unit 行为及依赖关系等;
  2. [Service],[Socket],[Timer],[Mount],[Path]等等:不同单元文件类型就得要使用相对应的设置项目,这个项目主要规范服务启动的脚本、环境配置文件文件名、重新启动的方式等等;
  3. **[Install]**:定义由 systemctl enable 以及 systemctl disable 命令在实现服务启用或禁用时用到的一些选项;
  4. # 开头的行后面的内容会被认为是注释;
  5. 相关布尔值,1yesontrue 都是开启,0noofffalse 都是关闭;
  6. 时间单位默认是,所以要用毫秒(ms)分钟(m)等须显式说明;
  7. 连词号 - ,表示抑制错误,即发生错误的时候不影响其他命令的执行。

Unit选项

可选项 描述
Description 对当前服务的简单描述
Documentation 当前服务的文档地址
After 可以指定在哪些服务之后进行启动,仅是说明服务启动的顺序而已
Before 可以指定在哪些服务之前进行启动,仅是说明服务启动的顺序而已
Requires 可以指定服务强依赖于哪些服务(一旦所依赖的服务异常,当前的服务也随之停止)
Wants 可以指定服务弱依赖于哪些服务(即使所依赖的服务的启动情况不影响当前的服务是否启动)
Conflicts 项目后面接的服务如果有启动,这个 Unit 本身就不能启动,若 Unit 有启动,则此项目后的服务就不启动

Service选项

可选项 描述
Environment 指定环境变量配置
EnvironmentFile 指定环境变量配置文件
ExecStart 指定服务启动时执行的命令或脚本
ExecStartPre 指定服务启动前执行的命令或脚本
ExecStartPost 指定服务启动后执行的命令或脚本
ExecStop 指明停止服务要运行的命令或脚本
ExecStopPost 指定服务停止之后执行的命令或脚本
RestartSec 指定服务在重启时等待的时间,单位为秒
ExecReload 指明重启服务要运行的命令或脚本
Restart 当设定 Restart=1 时,则当次 daemon 服务意外终止后,会再次自动启动此服务,具体看下列类型
PrivateTmp 设定为 yes 时,会在生成 /tmp/systemd-private-UUID-NAME.service-XXXXX/tmp/ 目录
KillMode 指定停止的方式,具体见下面
Restart 指定重启时的类型,具体见下面
Type 指定启动类型,具体见下面

Type的可选值

可选值 描述
simple 指定ExecStart字段的进程为主进程
forking 指定以fork() 子进程执行ExecStart字段的进程
oneshot 执行一次
notify 启动后发送会发送通知信号通知systemd
idle 等其他任务结束后才运行

Restart的可选值

可选值 描述
no 退出后不会重启
on-success 当进程正常退出时(退出码为0) 执行重启
on-failure 当进程不正常退出时(退出码不为0) 执行重启
on-abnormal 当被信号终止和超时执行重启
on-abort 当收到没有捕捉到的信号终止时执行重启
on-watchdog 当看门狗超时时执行重启
always 一直重启

KillMode可选值

可选值 描述
control-group 杀掉当前进程中所有的进程
process 杀掉当前进程的主进程
mixed 主进程将收到 SIGTERM 信号,子进程收到 SIGKILL 信号
none 不杀掉任何进程

Install选项

可选项 描述
Alias 别名,可使用systemctl command Alias.service
RequiredBy 被哪些units所依赖,强依赖
WantedBy 被哪些units所依赖,弱依赖
Also 安装本服务的时候还要安装别的相关服务

参考示例

1
2
3
4
5
6
7
8
9
10
11
12
13
[Unit]
Description=A Demo Tomcat Service
After=network.target mysql.service
Requires=mysql.service

[Service]
Type=forking
Environment="JAVA_HOME=/usr/local/java"
ExecStart=/usr/local/tomcat/bin/startup.sh
ExecStop=/usr/local/tomcat/bin/shutdown.sh

[Install]
WantedBy=multi-user.target

服务状态

运行状态

  • active(running):正有一只或多只程序正在系统中执行的意思;
  • active(exited):仅执行一次就正常结束的服务,目前并没有任何程序在系统中执行;
  • active(waiting):正在执行当中,不过还需要等待其他的事件才能继续处理;
  • inactive:这个服务目前没有运行;
  • dead:程序已经清除;

启动状态

  • enabled:将在开机时被执行;
  • disabled:在开机时不会被执行;
  • static:不可以自己启动(enable不可),不过可能会被其他的enabled 的服务来唤醒(关联属性的服务);
  • mask:无论如何都无法被启动,因为已经被强制注销(非删除),可通过 systemctlunmask 方式改回原本状态;