CentOS 7 systemctl 用法详解

systemd 是 Linux 系统中最新的初始化系统 (init), systemd 和 upstart 是竞争对手, ubantu 上使用的是 upstart 的启动方式, Centos 7 上使用 systemd.

systemctl 是管理服务的主要工具, 它整合了 chkconfig 与 service 功能于一体。
system: 系统启动和服务器守护进程管理器, 负责在系统启动或运行时, 激活系统资源, 服务器进程和其他进程, 字母 d 是守护进程 (daemon) 的缩写, systemd 这个名字的含义就是它要守护整个系统。

服务

systemctl is-enabled  nginx.service   # 查询服务是否开机启动
systemctl is-active   nginx.service   # 查询某服务当前激活的状态, 如果启动会显示 active, 否则会显示 unknown
systemctl enable      nginx.service   # 开机运行服务
systemctl disable     nginx.service   # 取消开机运行
systemctl start       nginx.service   # 启动服务
systemctl stop        nginx.service   # 停止服务
systemctl restart     nginx.service   # 重启服务
systemctl try-restart nginx.service   # 已启动才重启, 否则不做任何操作
systemctl reload-or-try-restart nginx.service # 先加载, 然后再启动
systemctl reload      nginx.service   # 重新加载服务配置文件
systemctl status      nginx.service   # 查询服务运行状态
systemctl kill        nginx.service   # 杀死进程

系统

systemctl reboot                                    # 重启机器
systemctl [ poweroff | halt ]                       # 关机
systemctl suspend                                   # 挂起-睡眠-保存在內存
systemctl hibernate                                 # 休眠-断电-保存在硬盘
systemctl hybrid-sleep                              # 混合休眠模式 (同时休眠到硬盘并挂起)
systemctl rescue                                    # 强制进入救援模式
systemctl emergency                                 # 强制进入紧急救援模式
systemctl is-active [unit type]                     # 查看服务是否运行
systemctl is-enable [unit type]                     # 查看服务是否设置为开机启动
systemctl mask [unit type]                          # 注销指定服务
systemctl unmask [unit type]                        # 取消注销指定服务
systemctl list-units                                # 列出所有启动 unit
systemctl list-unit-files                           # 列出所有启动文件 systemctl list-unit-files | grep firewalld
systemctl list-units -t service -all                # 列出所有 service 类型的 unit
systemctl list-units -t service -all grep cpu       # 列出 cpu电源管理机制的服务
systemctl list-units -t target -all                 # 列出所有 target
systemctl get-default                               # 获得当前的运行级别
systemctl set-default multi-user.target             # 设置默认的运行级别为 mulit-user
systemctl isolate multi-user.target                 # 在不重启的情况下, 切换到运行级别mulit-user 下
systemctl isolate graphical.target                  # 在不重启的情况下, 切换到图形界面下
systemctl daemon-reload                             # 重新载入 systemd, 扫描新的或有变动的单元
systemctl -t help                                   # 查看 Unit 类型
systemctl --failed                                  # 显示启动失败的服务
systemctl list-dependencies                         # 查看服务的依赖关系

配置文件位置

/usr/lib/systemd/system 每个服务最主要的启动脚本设置, 类似于之前的 /etc/initd.d

/run/system/system 系统执行过程中所产生的服务脚本, 比上面的目录优先运行

/etc/system/system 管理员建立的执行脚本, 类似于/etc/rc.d/rcN.d/Sxx 类的功能, 比上面目录优先运行, 在三者之中, 此目录优先级最高

服务状态

systemctl list-units -t service -a 显示状态

loaded: unit 配置文件已处理
active (running): 一次或多次持续处理的运行
active (exited):  成功完成一次性的配置
active (waiting): 运行中, 等待一个事件
inactive:         不运行
enabled:          开机启动
disabled:         开机不启动
static:           开机不启动, 但可以被另一个启用的服务激活

运行级别

unit 配置文件: 以 .target 结尾的文件

systemctl list-unit-files -t target -all
0 -> runlevel0.target, poweroff.target
1 -> runlevel1.target, rescue.target
2 -> runlevel2.target, muti-user.target
3 -> runlevel3.target, mutil-user.target
4 -> runlevel4.target, multi-user.target
5 -> runlevel5.target, graphical.target
6 -> runlevel6.target, reboot.target

Unit 类型

查看 Unit 类型

# systemctl -t help
Available unit types:
service        # 定义系统服务
socket         # 标识进程间通信用的 socket 文件, 也可以在系统启动时, 延迟启动服务, 实现按需启动
busname        #
target         # 模拟实现 "运行级别"
snapshot       # 系统快照
device         # 定义内核识别的设备
mount          # 定义文件系统挂载点
automount      # 文件系统的自动挂载点如: /misc 目录
swap           # 表示 swap 设备
timer          # 由 systemd 管理的计时器
path           # 定义文件系统中的一个文件或目录使用, 常用于当文件系统变化时, 延迟激活服务, 如 spool 目录
slice          #
scope          #

Unit 文件格式

# 开头的行后面的内容会被认为是注释

布尔值

  • 开启: 1yesonture
  • 关闭: 0noofffalse

时间单位默认是

Unit 文件组成

  • [Unit] : 定义 Unit 描述, 启动顺序, 依赖关系
  • [Service] : 与特定类型相关的专用选项, 此处为Service类型
  • [Install] : 定义由 systemctl enablesystemctl disable 命令在实现服务启用或禁用时用到的一些选项

[Unit] 选项

  • Description: 描述信息
  • before: 在哪些服务前启动
  • After: 定义服务的启动次序, 表示当前服务应该晚与哪些服务启动, 其功能与 before 相反
  • Requires: 依赖到的其他服务, 强依赖, 被依赖的服务无法激活时, 当前服务即无法激活
  • Wants: 依赖到的其他服务, 弱依赖
  • Conflicts: 定义服务间的冲突关系

[Service] 选项

  • Type: 服务启动类型
    • simple: 默认值, 这个 daemon 主要由 ExecStart 参数的命令行来启动, 启动后常驻于内存中
    • forking: 由 ExecStart 启动的程序透过spawns延伸出其他子程序来作为此 daemon 的主要服务。原生父程序在启动结束后就会终止
    • onshot: 用于执行一项任务, 随后立即退出的服务, 不会常驻于内存中
    • notify: 与 simple 相同, 但约定服务会在就绪后向 systemd 发送一个信号, 需要配合 NotifyAccess 来让 systemd 接收消息
    • idle: 与 simple 类似, 要执行这个 daemon 必须要所有的工作都顺利执行完毕后才会执行。这类的 daemon 通常是开机到最后才只能激活的服务
  • User: 用户
  • Group: 用户组
  • EnvironmentFile: 环境配置文件
  • ExeStart: 指明启动服务要运行命令或脚本的绝对路径
  • ExeStartPre: 在 ExecStart 前运行
  • ExeStartPost: 在 ExecStart 后运行
  • ExecStop: 停止服务运行的命令或脚本
  • Restart: 当设定 Restart=1 时, 则服务意外终止后, 总是自动重新启动此服务

[Install] 选项

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

例子

# vim /etc/systemd/system/transmission.service

[Unit]
Description=Transmission Service
After=network.target

[Service]
LimitNOFILE=666666
User=user
Group=user
ExecStart=/usr/bin/transmission-daemon --log-error -f
ExecStop=/usr/bin/killall -w -s 9 /usr/bin/transmission-daemon

[Install]
WantedBy=multi-user.target

普通用户模式

systemd 支持普通用户定义的 unit[s] 开机启动

--user 不可省略, 因为默认是执行 systemctl [--system], 对于系统级 unit[s] 来说, 不必显式添加 --system 选项

systemctl --user enable/disable/start/stop/daemon-reload xxx.timer/xxx.service

用户自定义的 unit[s] 可以放置在如下四个位置 (按优先级从低到高排序)

  • /usr/lib/systemd/user/ 这里存放的是各个软件包安装的服务。
  • ~/.local/share/systemd/user/ 这里存放的是HOME目录中已安装的软件包的单元。
  • /etc/systemd/user/ 这里存放的是由系统管理员维护的系统范围的用户服务。
  • ~/.config/systemd/user/ 这里存放的是用户自身的服务。
  1. 用户级 unit 与系统级 unit 相互独立, 不能互相关联或依赖
  2. 用户级 unit 运行环境用 default.target, 系统级通常用 multi-user.target
  3. 即使用户不登陆, 其定制的服务依然会启动
最后更新于 2022-03-27
使用 Hugo 构建
主题 StackJimmy 设计