Systemd(系统管理守护进程),最开始以GNU GPL协议授权开发,现在已转为使用GNU LGPL协议,它是如今讨论最热烈的引导和服务管理程序。如果你的Linux系统配置为使用Systemd引导程序,它取替传统的SysV init,启动过程将交给systemd处理。Systemd的一个核心功能是它同时支持SysV init的后开机启动脚本。-----------系统进程管理工具
systemd是目前Linux系统上主要的系统守护进程管理工具,由于init一方面对于进程的管理是串行化的,容易出现阻塞情况,另一方面init也仅仅是执行启动脚本,并不能对服务本身进行更多的管理。所以从CentOS 7开始也由systemd取代了init作为默认的系统进程管理工具。
systemd 是内核启动后的第一个用户进程,PID 为1,是所有其它用户进程的父进程。
最新系统都采用systemd管理(RedHat7,CentOS7,Ubuntu20.04…) CentOS7
支持开机并行启动服务,显著提高开机启动效率 CentOS7关机只关闭正在运行的服务,而CentOS6,全部都关闭一次。
CentOS7服务的启动与停止不再使用脚本进行管理,也就是/etc/init.d下不在有脚本。
CentOS7使用systemd解决原有模式缺陷,比如原有service不会关闭程序产生的子进程
系统初始化需要做的事情非常多。需要启动后台服务,比如启动 ssh 服务;需要做配置工作,比如挂载文件系统。这个过程中的每一步都被 systemd 抽象为一个配置单元
,即 unit。可以认为一个服务是一个配置单元
,一个挂载点是一个配置单元
,一个交换分区的配置是一个配置单元
等等。
类型 | 描述 |
---|---|
service | 代表一个后台服务进程,比如 MySQLd。这是最常用的一类。 |
socket | 此类配置单元封装系统和互联网中的一个套接字 。当下,systemd 支持流式、数据报和 连续包的 AF_INET、AF_INET6、AF_UNIX socket 。每一个套接字配置单元都有一个相应的服务配置单元 。相应的服务在第一个"连接"进入套接字时就会启动(例如:nscd.socket 在有新连接后便启动 nscd.service)。 |
device | 此类配置单元封装一个存在于 Linux 设备树中的设备。每一个使用 udev 规则标记的设备都将会在 systemd 中作为一个设备配置单元出现。 |
mount | 此类配置单元封装文件系统结构层次中的一个挂载点。Systemd 将对这个挂载点进行监控和管理。比如可以在启动时自动将其挂载;可以在某些条件下自动卸载。Systemd 会将 /etc/fstab 中的条目都转换为挂载点,并在开机时处理。 |
automount | 此类配置单元封装系统结构层次中的一个自挂载点。每一个自挂载配置单元对应一个挂载配置单元 ,当该自动挂载点被访问时,systemd 执行挂载点中定义的挂载行为。 |
swap | 和挂载配置单元类似,交换配置单元用来管理交换分区。用户可以用交换配置单元来定义系统中的交换分区,可以让这些交换分区在启动时被激活。 |
target | 此类配置单元为其他配置单元进行逻辑分组。它们本身实际上并不做什么,只是引用其他配置单元而已。这样便可以对配置单元做一个统一的控制。这样就可以实现大家都已经非常熟悉的运行级别概念。比如想让系统进入图形化模式,需要运行许多服务和配置命令,这些操作都由一个个的配置单元表示,将所有这些配置单元组合为一个目标(target),就表示需要将这些配置单元全部执行一遍以便进入目标所代表的系统运行状态。 (例如:multi-user.target 相当于在传统使用 SysV 的系统中运行级别 5) |
timer | 定时器配置单元用来定时触发用户定义的操作,这类配置单元取代了 atd、crond 等传统的定时服务。 |
snapshot | 与 target 配置单元相似,快照是一组配置单元。它保存了系统当前的运行状态。 |
path | 文件系统中的一个文件或目录。 |
scope | 用于 cgroups,表示从 systemd 外部创建的进程。 |
slice | 用于 cgroups,表示一组按层级排列的单位。slice 并不包含进程,但会组建一个层级,并将 scope 和 service 都放置其中。 |
每个配置单元都对应的配置文件,系统管理员的任务就是编写和维护这些不同的配置文件
比如常见的Mysql服务对应一个mysql.service文件
文件后缀 | 说明 |
---|---|
.automount | 用于控制自动挂载文件系统,相当于 SysV-init 的 autofs 服务 |
.device | 对于 /dev 目录下的设备,主要用于定义设备之间的依赖关系 |
.mount | 定义系统结构层次中的一个挂载点,可以替代过去的 /etc/fstab 配置文件 |
.path | 用于监控指定目录或文件的变化,并触发其它 Unit 运行 |
.scope | 这种 Unit 文件不是用户创建的,而是 Systemd 运行时产生的,描述一些系统服务的分组信息 |
.service | 封装守护进程的启动、停止、重启和重载操作,是最常见的一种 Unit 文件 |
.slice | 用于表示一个 CGroup 的树,通常用户不会自己创建这样的 Unit 文件 |
.snapshot | 用于表示一个由 systemctl snapshot 命令创建的 Systemd Units 运行状态快照 |
.socket | 监控来自于系统或网络的数据消息,用于实现基于数据自动触发服务启动 |
.swap | 定义一个用户做虚拟内存的交换分区 |
.target | 用于对 Unit 文件进行逻辑分组,引导其它 Unit 的执行。它替代了 SysV-init 运行级别的作用,并提供更灵活的基于特定设备事件的启动方式 |
.timer | 用于配置在特定时间触发的任务,替代了 Crontab 的功能 |
Unit 文件按照 Systemd 约定,应该被放置指定的三个系统目录之一中。这三个目录是有优先级的,如下所示,越靠上的优先级越高。因此,在三个目录中有同名文件的时候,只有优先级最高的目录里的那个文件会被使用。
/etc/systemd/system/ 系统或用户自定义的配置文件
/run/systemd/system/ 软件运行时生成的配置文件
/usr/lib/systemd/system/ 系统或第三方软件安装时添加的配置文件
Systemd 默认从目录 /etc/systemd/system/ 读取配置文件。但是,里面存放的大部分文件都是符号链接,指向目录 /usr/lib/systemd/system/,真正的配置文件存放在那个目录。
Target 就是一个 Unit 组,包含许多相关的 Unit 。
Unit 是 Systemd 管理系统资源的基本单元,可以认为每个系统资源就是一个 Unit,并使用一个 Unit 文件定义。在 Unit 文件中需要包含相应服务的描述、属性以及需要运行的命令。
每一个服务以.service
结尾,一般会分为3部分:[Unit]
、[Service]
和[Install]
此部分中使用的参数不仅限于 service 类型的 unit,对其它类型 unit 也是通用的,有关这些参数及其说明的完整列表,可运行命令 man systemd.unit 或访问 systemd.unit 中文手册
参数 | 参数说明 |
---|---|
Description= | 当前 unit 的描述 |
Documentation= | 文档地址,仅接受类型为:http://、https://、file:、info:、man: 的URI |
Requires= | 表示本 unit 与其它 unit 之间存在强依赖关系,如果本 unit 被激活,此处列出的 unit 也会被激活,如果其中一个依赖的 unit 无法激活,systemd 都不会启动本 unit |
Wants= | 与 Requires 类似,区别在于如果依赖的 unit 启动失败,不影响本 unit 的继续运行 |
After= | 表示本 unit 应该在某服务之后启动,选项可参考 systemd.special 中文手册 |
Before= | 表示本 unit 应该在某服务之前启动,After和Before 字段只涉及启动顺序,不涉及依赖关系 |
BindsTo= | 与 Requires 类似,当指定的 unit 停止时,也会导致本 unit 停止 |
PartOf= | 与 Requires 类似,当指定的 unit 停止或重启时,也会导致本 unit 停止或重启 |
Conflicts= | 如果指定的 unit 正在运行,将导致本 unit 无法运行 |
OnFailure= | 当本 unit 进入故障状态时,激活指定的 unit |
注意:在 [unit] 块中的每个参数后都可以指定一个以空格分隔的列表
只有 service 类型的 unit 才有这些参数,参数完整列表请访问 systemd.service 中文手册
参数 | 参数说明 |
Type= | simple(默认值):服务为主进程启动,systemd 认为该服务将立即启动,服务进程不会 fork ,如果该服务要启动其他服务,则不要使用此类型启动,除非该服务是 socket 激活型。 forking:服务将以fork分叉的方式启动,此时父进程将会退出,子进程将成为主进程。 systemd 认为当该服务进程 fork,且父进程退出后服务启动成功。对于常规的守护进程(daemon)除非你确定此启动方式无法满足需求,否则使用此类型启动即可。使用此启动类型应同时指定 PIDFile= 以便 systemd 能够跟踪服务的主进程 oneshot:类似于simple,但只执行一次,Systemd会等它执行完,才启动其它服务。这一选项适用于只执行一项任务,随后立即退出的服务。可能需要同时设置 RemainAfterExit=yes 使得 systemd 在服务进程退出之后仍然认为服务处于激活状态 dbus:类似于simple,但会等待D-Bus信号后启动。当指定的 BusName 出现在DBus系统总线上时,systemd 认为服务就绪。 notify:类似于simple,启动完毕后会通知 Systemd ,然后继续往下执行 idle:类似于simple,但是要等到其它所有任务都执行完,才会启动该服务 |
RemainAfterExit= | 一个布尔值,它指定即使服务的所有进程都已退出,也应将服务视为活动的,默认为 no |
GuessMainPID= | 一个布尔值,指定systemd在无法可靠确定服务的主 PID 时是否应该猜测它。除非设置了 Type=forking 并且未设置 PIDFile,否则此选项将被忽略,默认为 yes |
PIDFile= | 指向此守护进程的 PID 文件的绝对文件名。对于 Type=forking 的服务,建议使用此选项。Systemd 在服务启动后读取守护进程的主进程的 PID。Systemd 不会写入此处配置的文件,但它会在服务关闭后删除该文件 |
BusName= | 到达此服务的 D-Bus 总线名称。对于 Type=dbus 的服务,此选项是必需的 |
ExecStart= | 服务启动时执行的命令和参数 |
ExecStartPre= | 服务启动之前执行的命令 |
ExecStartPost= | 服务启动之后执行的命令 |
ExecReload= | 重启服务时执行的命令 |
ExecStop= | 服务停止时执行的命令和参数 |
ExecStopPost= | 服务停止之后执行的命令 |
RestartSec= | 重新启动服务前的睡眠时间(以秒为单位) |
TimeoutStartSec= | 等待服务启动的时间(以秒为单位) |
TimeoutStopSec= | 等待服务停止的时间(以秒为单位) |
TimeoutSec= | 同时配置TimeoutStartSec和TimeOutshopSec的缩写 |
Restart= | 配置当服务的进程退出、被杀死或达到超时时是否重新启动服务,可以设置的值如下: no 服务将不会重新启动,这是默认设置 on-success 仅当服务进程完全退出时重新启动(退出代码0) on-failure 仅在服务进程异常退出时重启,所谓“异常退出”是指:退出码不为"0" on-abnormal 如果进程因信号或超时而终止时重新启动 on-watchdog 当看门狗超时而重新启动 on-abort 如果进程由于未指定为干净退出状态的未捕获信号而退出,则重新启动always 总是重新启动 |
Environment= | 指定环境变量 |
KillMode= | 定义systemd如何停止服务,可以设置的值如下: control-group(默认值):当前控制组里面的所有子进程,都会被杀掉 process:只杀主进程 mixed:主进程将收到SIGTERM信号,子进程收到SIGKILL信号 none:没有进程会被杀掉,只是执行服务的stop命令 |
下面列出了 service, socket, mount, swap 单元所共有的、 用于定义进程执行环境的配置选项,完整参数说明可运行命令 man systemd.exec 或访问 systemd.exec 中文手册
参数 | 参数说明 |
---|---|
WorkingDirectory= | 设置进程的工作目录 |
User= | 设置进程在执行时使用的用户与组,可以设为一个数字形式的 UID/GID |
NoNewPrivileges= | 接收一个布尔值。设为 yes 表示该服务的所有进程与子进程都不能通过 execve() 调用获得任何新权限。该选项是最简单也是最有效的防止进程提升权限的方法 |
SELinuxContext= | 设置进程的 SELinux 安全上下文 |
UMask= | 设置文件创建掩码,默认值为 0022 |
LogLevelMax= | 按此日志级别过滤该单元生成的日志消息,可设为一个 syslog 日志级别,也就是 emerg(最低日志级别,仅显示最致命的消息), alert, crit, err, warning, notice, info, debug(最高日志级别,显示最细致的调试消息) 之一 |
OOMScoreAdjust= | 设置进程因内存不足而被杀死的优先级。可设为 -1000(禁止被杀死) 到 1000(最先被杀死)之间的整数值 |
Environment= | 设置进程的环境变量, 接受一个空格分隔的 VAR=VALUE 列表。 可以多次使用此选项以增加新的变量或者修改已有的变量(同一个变量以最后一次设置为准)。设为空表示清空先前所有已设置的变量。 注意: (1)不会在字符串内部进行变量展开(也就是 $ 没有特殊含义);(2)如果值中包含空格或者等号,那么必须在字符串两边使用双引号(")界定 例如: Environment=“VAR1=word1 word2” VAR2=word3 “VAR3= $ word 5 6” 表示设置了 “VAR1”, “VAR2”, “VAR3” 三个变量,其值分别为 “word1 word2”, “word3”, “$word 5 6” |
StandardInput= | 设置进程的标准输入(STDIN),可设为 null, tty, tty-force, tty-fail, data, file:path, socket, fd:name 之一,此选项的默认值是 null |
StandardOutput= | 设置进程的标准输出(STDOUT),可设为 inherit, null, tty, journal, syslog, kmsg, journal+console, syslog+console, kmsg+console, file:path, append:path, socket, fd:name 之一 |
StandardInputText, StandardInputData | 设置通过标准输入(STDIN)传递给进程的任意文本或二进制数据,这些选项仅在 StandardInput=data 时有意义 |
$PATH:可执行文件的目录列表(冒号分隔的绝对路径), 此值固定为 /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
$LANG:本地化设置。可以通过 locale.conf(5) 文件设置
$USER, $LOGNAME, $HOME, $SHELL:用户名, 用户名, 家目录, 登录shell
$MAINPID:单元主进程的PID (如果能确定的话)
service, socket, mount, swap, scope 单元都拥有一组如何杀死进程的配置选项,完整参数说明可运行命令 man systemd.kill 或访问 systemd.kill 中文手册
参数 | 参数说明 |
---|---|
KillMode= | 设置在单元停止时,杀死进程的方法。取值范围如:control-group, process, mixed, none 默认值是 control-group 表示杀死该单元的 cgroup 内的所有进程(对于 service 单元,还要先执行 ExecStop= 动作) |
KillSignal= | 设置杀死进程的第一步使用什么信号,所有可用的信号详见 signal(7) 手册。 默认值为 SIGTERM 信号。注意, systemd 会无条件的紧跟此信号之后再发送一个 SIGCONT 信号, 以确保干净的杀死已挂起(suspended)的进程 |
SendSIGHUP= | 是否在第一步发送 KillSignal= 信号后,立即紧跟着向该单元的所有进程再发送一个 SIGHUP 信号。这主要用于通知 shell 之类的进程,它们的连接已中断。默认为"no" |
SendSIGKILL= | 是否在超过 TimeoutStopSec= 时间后,使用 SIGKILL 或 FinalKillSignal= 信号杀死依然残存的进程。默认值为"yes" |
FinalKillSignal= | 当发生了超时并且已开启 SendSIGKILL= 时, 发送哪个信号给剩余的进程。应当设置为不能被服务捕获和处理的信号(SIGTERM 就不合适)。对于开发人员来说,可以使用它来生成 coredump 以了解为什么服务在接收到最初的 SIGTERM 信号时没有正确终止。具体做法是设置 LimitCORE= 并且将 FinalKillSignal= 设为 SIGQUIT 或 SIGABRT 之一。此选项的默认值为 SIGKILL |
WatchdogSignal= | 在看门狗(WatchdogSec=)发生超时的情况下,使用哪个信号终止服务。此选项的默认值为 SIGABRT |
slice, scope, service, socket, mount, swap 单元共享一组用于限制进程资源占用的配置选项,本质上,这些选项依赖于Linux内核的 cgroups 功能,将一组进程组织成树形层次结构,并对其允许占用的各种资源进行限制,有关这些参数及其说明的完整列表,可运行命令 man systemd.resource-control 或访问 systemd.resource-control 中文手册
[install] 定义了 unit 的安装信息,此部分配置仅在 systemctl enable 或 systemctl disable 时使用,在 unit 运行时不解释此部分,相当于是配置如何开机启动
此部分中使用的参数不仅限于service类型的unit,对其它类型的 unit也是通用的,有关这些参数及其说明的完整列表,可运行命令 man systemd.unit 或访问 systemd.unit 中文手册
参数 | 参数说明 |
---|---|
Alias= | 当前 unit 可用于启动的别名,此处列出的名称必须与服务文件名具有相同的后缀(即类型),在执行 systemctl enable 时将创建从这些名称到 unit 文件名的符号链接 |
RequiredBy= | 表示该服务所在的Target,它的值是一个或多个Target,当 systemctl enable 时 unit 符号链接会放入 /etc/systemd/system 目录下面以 Target名 + .required 后缀构成的子目录中 |
WantedBy= | 表示该服务所在的Target,它的值是一个或多个Target,当前 systemctl enable 时 unit符号链接会放入 /etc/systemd/system 目录下面以 Target名 + .wants 后缀构成的子目录中 |
Also= | 当 systemctl enable 或 systemctl disable 时会同时 enable 和 disable 的其它 unit 列表 |
Target的含义是服务组,表示一组服务 WantedBy=multi-user.target 指的是,unit 所在的 Target 是multi-user.target(多用户模式)
这个设置非常重要,因为执行systemctl enable 是会将 unit 链接到 /etc/systemd/system/multi-user.target.wants目录之中,实现开机启动的功能
# nginx的unit 配置文件
cat /usr/lib/systemd/system/nginx.service
[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/run/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/bin/sh -c "/bin/kill -s HUP $(/bin/cat /usr/local/nginx/run/nginx.pid)"
ExecStop=/bin/sh -c "/bin/kill -s TERM $(/bin/cat /usr/local/nginx/run/nginx.pid)"
[Install]
WantedBy=multi-user.target
# redis的unit 配置文件
[Unit]
Description=Redis data structure server
Documentation=https://redis.io/documentation
Wants=network-online.target
After=network-online.target
[Service]
ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf
LimitNOFILE=10032
NoNewPrivileges=yes
OOMScoreAdjust=-900
Type=notify
User=redis
Group=redis
[Install]
WantedBy=multi-user.target
# mysql的unit 配置文件
[Unit]
Description=mysql server
Documentation=https://dev.mysql.com/doc/refman/5.7/en/using-systemd.html
After=network.target
After=syslog.target
[Service]
User=mysql
Group=mysql
Type=forking
PIDFile=/usr/local/mysql/mysqld.pid
ExecStart=/usr/local/mysql/bin/mysqld --daemonize --pid-file=/usr/local/mysql/mysqld.pid $MYSQLD_OPTS
LimitNOFILE=5000
Restart=on-failure
[Install]
WantedBy=multi-user.target
# prometheus的unit 配置文件
[Unit]
Description=prometheus service
Documentation=https://prometheus.io/docs/prometheus/latest/management_api
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/prometheus/prometheus \
--config.file=/usr/local/prometheus/prometheus.yml \
--storage.tsdb.retention.time=92d \
--storage.tsdb.path=/usr/local/prometheus/data \
--web.listen-address=0.0.0.0:9090 \
--web.console.templates=/usr/local/prometheus/consoles \
--web.console.libraries=/usr/local/prometheus/console_libraries
#如果想要输出日志重定向到文件,可以按如下方式,注意此时就不能使用续行符了
#ExecStart=/bin/bash -ce "/usr/local/prometheus/prometheus --config.file=/usr/local/prometheus/prometheus.yml >> /var/log/prometheus.log 2>&1"
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
Restart=on-failure
[Install]
WantedBy=multi-user.target
# alertmanager的unit 配置文件
[Unit]
Description=alertmanager service
Documentation=https://prometheus.io/docs/alerting/latest/management_api
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/alertmanager/alertmanager \
--config.file=/usr/local/alertmanager/alertmanager.yml \
--storage.path=/usr/local/alertmanager/data \
--data.retention=120h \
--web.listen-address=0.0.0.0:9093
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
Restart=on-failure
[Install]
WantedBy=multi-user.target
# node_exporter的unit配置文件
[Unit]
Description=node_exporter
Documentation=https://github.com/prometheus/node_exporter
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/prometheus_exporter/node_exporter-1.1.2.linux-amd64/node_exporter \
--web.listen-address=0.0.0.0:9100 \
--web.telemetry-path=/metrics
ExecStop=/bin/kill -s TERM $MAINPID
Restart=on-failure
[Install]
WantedBy=multi-user.target
# redis_exporter的unit配置文件
[Unit]
Description=redis_exporter
Documentation=https://github.com/oliver006/redis_exporter
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/prometheus_exporter/redis_exporter-v1.25.0.linux-amd64/redis_exporter \
-redis.addr=localhost:6379 \
-redis.password=123456 \
-web.listen-address=:9121 \
-web.telemetry-path=/metrics
Restart=on-failure
[Install]
WantedBy=multi-user.target
# blackbox_exporter的unit配置文件
[Unit]
Description=blackbox_exporter
Documentation=https://github.com/prometheus/blackbox_exporter
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/prometheus_exporter/blackbox_exporter-0.19.0.linux-amd64/blackbox_exporter \
--web.listen-address=0.0.0.0:9115 \
--config.file=/usr/local/prometheus_exporter/blackbox_exporter-0.19.0.linux-amd64/blackbox.yml
ExecStop=/bin/kill -s TERM $MAINPID
ExecReload=/bin/kill -s HUP $MAINPID
Restart=on-failure
[Install]
WantedBy=multi-user.target
# mysqld_exporter的unit配置文件
[Unit]
Description=mysql_exporter
Documentation=https://github.com/prometheus/mysqld_exporter
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/prometheus_exporter/mysqld_exporter-0.13.0.linux-amd64/mysqld_exporter \
--config.my-cnf=/usr/local/prometheus_exporter/mysqld_exporter-0.13.0.linux-amd64/.my.cnf \
--web.listen-address=:9104 \
--web.telemetry-path=/metrics
Restart=on-failure
[Install]
WantedBy=multi-user.target
# systemd管理java进程
[Unit]
Description=question_api
Documentation=https://docs.oracle.com/javase/tutorial/deployment/jar/basicsindex.html
After=network.target
[Service]
Type=forking
SuccessExitStatus=143
ExecStart=/bin/sh -c "/usr/local/java/jdk1.8.0_201/bin/java -Xms2048m -Xmx2048m -jar /app/question_api/question_api_beta.jar --server.port=8080 >> /var/log/app/question_api.log 2>&1 &"
ExecStop=/bin/kill -s TERM $MAINPID
Restart=on-failure
[Install]
WantedBy=multi-user.target
# 配置项 SuccessExitStatus=143 是为了抑制stop时报错 Main process exited, code=exited, status=143/n/a
# 这是因为 java 程序在响应 SIGTERM 时不会并不会发回预期的退出状态
# 所以需要将退出代码 SuccessExitStatus=143 添加到 systemd 服务文件作为成功退出状态来抑制这种报错
systemctl start chronyd #启动
systemctl stop chronyd #停止
systemctl restart chronyd #重启
systemctl status chronyd #查看 unit 状态
systemctl enable chronyd #设置 unit 开启启动
systemctl disable chronyd #取消 unit 开机启动
systemctl is-enabled chronyd #查看 unit 是否开机启动
# 重新加载 unit 的配置文件,每次修改了 unit 的配置文件后,需要执行以下命令重新加载 unit 的配置文件
systemctl daemon-reload
systemctl mask chronyd #屏蔽 unit,屏蔽后 unit 无法启动
systemctl unmask chronyd #取消屏蔽
# 更多命令可通过 systemctl --help 或 man systemctl 来查看
systemctl [OPTIONS...] {COMMAND} ...
Query or send control commands to the systemd manager.
-h --help Show this help
--version Show package version
--system Connect to system manager
--user Connect to user service manager
-H --host=[USER@]HOST
Operate on remote host
-M --machine=CONTAINER
Operate on local container
-t --type=TYPE List units of a particular type
--state=STATE List units with particular LOAD or SUB or ACTIVE state
-p --property=NAME Show only properties by this name
-a --all Show all properties/all units currently in memory,
including dead/empty ones. To list all units installed on
the system, use the 'list-unit-files' command instead.
--failed Same as --state=failed
-l --full Don't ellipsize unit names on output
-r --recursive Show unit list of host and local containers
--reverse Show reverse dependencies with 'list-dependencies'
--job-mode=MODE Specify how to deal with already queued jobs, when
queueing a new job
--show-types When showing sockets, explicitly show their type
--value When showing properties, only print the value
-i --ignore-inhibitors
When shutting down or sleeping, ignore inhibitors
--kill-who=WHO Who to send signal to
-s --signal=SIGNAL Which signal to send
--now Start or stop unit in addition to enabling or disabling it
--dry-run Only print what would be done
-q --quiet Suppress output
--wait For (re)start, wait until service stopped again
--no-block Do not wait until operation finished
--no-wall Don't send wall message before halt/power-off/reboot
--no-reload Don't reload daemon after en-/dis-abling unit files
--no-legend Do not print a legend (column headers and hints)
--no-pager Do not pipe output into a pager
--no-ask-password
Unit Commands:
list-units [PATTERN...] List units currently in memory
list-sockets [PATTERN...] List socket units currently in memory, ordered
by address
list-timers [PATTERN...] List timer units currently in memory, ordered
by next elapse
start NAME... Start (activate) one or more units
stop NAME... Stop (deactivate) one or more units
reload NAME... Reload one or more units
restart NAME... Start or restart one or more units
try-restart NAME... Restart one or more units if active
reload-or-restart NAME... Reload one or more units if possible,
otherwise start or restart
try-reload-or-restart NAME... If active, reload one or more units,
if supported, otherwise restart
isolate NAME Start one unit and stop all others
kill NAME... Send signal to processes of a unit
is-active PATTERN... Check whether units are active
is-failed PATTERN... Check whether units are failed
status [PATTERN...|PID...] Show runtime status of one or more units
show [PATTERN...|JOB...] Show properties of one or more
units/jobs or the manager
cat PATTERN... Show files and drop-ins of one or more units
set-property NAME ASSIGNMENT... Sets one or more properties of a unit
help PATTERN...|PID... Show manual for one or more units
reset-failed [PATTERN...] Reset failed state for all, one, or more
units
list-dependencies [NAME] Recursively show units which are required
or wanted by this unit or by which this
unit is required or wanted
Unit File Commands:
list-unit-files [PATTERN...] List installed unit files
enable [NAME...|PATH...] Enable one or more unit files
disable NAME... Disable one or more unit files
reenable NAME... Reenable one or more unit files
preset NAME... Enable/disable one or more unit files
based on preset configuration
preset-all Enable/disable all unit files based on
preset configuration
is-enabled NAME... Check whether unit files are enabled
mask NAME... Mask one or more units
unmask NAME... Unmask one or more units
link PATH... Link one or more units files into
the search path
revert NAME... Revert one or more unit files to vendor
version
add-wants TARGET NAME... Add 'Wants' dependency for the target
on specified one or more units
add-requires TARGET NAME... Add 'Requires' dependency for the target
on specified one or more units
edit NAME... Edit one or more unit files
get-default Get the name of the default target
set-default NAME Set the default target
Machine Commands:
list-machines [PATTERN...] List local containers and host
Job Commands:
list-jobs [PATTERN...] List jobs
cancel [JOB...] Cancel all, one, or more jobs
Environment Commands:
show-environment Dump environment
set-environment NAME=VALUE... Set one or more environment variables
unset-environment NAME... Unset one or more environment variables
import-environment [NAME...] Import all or some environment variables
Manager Lifecycle Commands:
daemon-reload Reload systemd manager configuration
daemon-reexec Reexecute systemd manager
System Commands:
is-system-running Check whether system is fully running
default Enter system default mode
rescue Enter system rescue mode
emergency Enter system emergency mode
halt Shut down and halt the system
poweroff Shut down and power-off the system
reboot [ARG] Shut down and reboot the system
kexec Shut down and reboot the system with kexec
exit [EXIT_CODE] Request user instance or container exit
switch-root ROOT [INIT] Change to a different root file system
suspend Suspend the system
hibernate Hibernate the system
hybrid-sleep Hibernate and suspend the system
suspend-then-hibernate Suspend the system, wake after a period of
time and put it into hibernate