Systemd

一、systemctl介绍

systemd 是一种用于 Linux 操作系统的系统和服务管理器,被设计为 init 系统的替代品。它负责在系统启动时启动系统组件,以及在系统运行期间管理系统进程。自从 Linux 内核 2.6.32 版本后,许多主流的 Linux 发行版,如 Fedora、Ubuntu、Debian 和 CentOS,都采用了 systemd 作为默认的初始化系统。

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

核心组件:

Systemd 包含多个组件,这些组件协同工作以提供系统和服务管理功能。以下表格简要列出了 Systemd 的核心组件及其功能:

组件  

作用
systemd  Systemd 的主进程,负责系统初始化和服务管理。
systemctl   Systemd 的命令行工具,用于控制和管理服务。
journald   Systemd 的日志管理组件,收集和管理系统日志。
logind   用户登录和会话管理组件,用于管理用户会话。
networkd   用户登录和会话管理组件,用于管理用户会话。
resolved   DNS 解析组件,提供域名解析服务。
timesyncd  时间同步组件,用于同步系统时间。
udevd  设备管理器,管理设备的插拔事件。
timedated  管理系统时间和时区设置。
coredumpd   收集系统中的崩溃报告。

二、主要特点

1.并行启动服务

  • systemd 能够并行地启动系统服务,缩短系统启动时间。
  • 通过服务的依赖关系,确保必要的服务按正确的顺序启动。

2. 按需启动(Socket 激活)

  • 仅在需要时启动服务,减少资源消耗。
  • 使用套接字激活机制,systemd 可以在有请求时自动启动相关服务。

3. 统一的进程管理

  • 提供 systemctl 命令,统一管理系统服务的启动、停止、重启和状态查询。
  • 支持服务的自动重启、监控和日志记录。

4. cgroups 资源控制

  • 利用 Linux 内核的 cgroups(控制组)功能,systemd 可以限制和监控服务的资源使用,如 CPU、内存和 I/O。

5. 日志系统(journald)

  • 内置日志系统 systemd-journald,收集和管理系统日志。
  • 支持集中化的二进制日志存储,提供灵活的日志查询功能。

6. 目标单元(Targets)

  • 替代传统的运行级别(runlevels),提供更灵活的系统状态管理。
  • 通过目标单元,可以定义系统在不同状态下应该运行的服务集合。

7. 定时器单元(Timers)

  • 替代 cron 等传统定时任务调度器。
  • 可以为服务配置定时启动和周期性执行。

三、核心概念

1.单元(Units)
  • systemd 以单元为基本管理对象,每个单元代表系统中的一个资源或服务。
  • 常见的单元类型:
    • 服务单元(.service):管理系统服务。
    • 目标单元(.target):表示系统的状态或运行级别。
    • 挂载单元(.mount):管理文件系统挂载点。
    • 套接字单元(.socket):用于套接字激活机制。
    • 定时器单元(.timer):管理定时任务。
    • 设备单元(.device):表示内核识别的设备。
    • 路径单元(.path):监控文件系统中的路径变化。
2. 单元文件
  • 定义单元的行为和配置,通常位于 /lib/systemd/system//etc/systemd/system/ 目录下。
  • 单元文件的基本结构包括 [Unit][Service][Install] 等节。
3. 依赖关系
  • 单元之间可以通过依赖关系(如 RequiresWantsBeforeAfter)来定义启动顺序和条件
4.systemd unit文件格式

service文件一共有三个地方可以存放
/etc/systemd/system/
/usr/lib/systemd/system/
/lib/systemd/system/

4.1、unit 格式说明:

1、以 “#” 开头的行后面的内容会被认为是注释
2、相关布尔值,1、yes、on、true 都是开启,0、no、off、false 都是关闭
3、时间单位默认是秒,所以要用毫秒(ms)分钟(m)等须显式说明


4.2、service unit file文件通常由三部分组成:
4.2.1、[Unit]:定义与Unit类型无关的通用选项;用于提供unit的描述信息、unit行为及依赖关系等

Description:       描述信息

Documentation: 文档地址

Requires:     依赖到的其它units,强依赖,被依赖的units无法激活时,当前unit也无法激活

Wants:                依赖到的其它units,弱依赖

Conflicts:            定义units间的冲突关系

Condition…:       当前 Unit 运行必须满足的条件,否则不会运行

Assert…:           当前 Unit 运行必须满足的条件,否则会报启动失败

After:         定义unit的启动次序,表示当前unit应该晚于哪些unit启动,其功能与Before相反

BindsTo:           与Requires类似,它指定的 Unit 如果退出,会导致当前 Unit 停止运行

Before:             如果该字段指定的 Unit 也要启动,那么必须在当前 Unit 之后启动

从上面的输出可以看到,配置文件分成几个区块。每个区块的第一行,是用方括号表示的区别名,比如[Unit]。注意,配置文件的区块名和字段名,都是大小写敏感的。每个区块内部是一些等号连接的键值对;注意,键值对的等号两侧不能有空格.

4.2.2、[Service]:与特定类型相关的专用选项;此处为Service类型

[Service]区块用来 Service 的配置,只有 Service 类型的 Unit 才有这个区块。它的主要字段如下。

  • Type:定义影响ExecStart及相关参数的功能的unit进程启动类型
    • Type=simple:默认值,这个daemon主要由ExecStart接的指令串来启动,启动后常驻于内存中
    • Type=forking:由ExecStart启动的程序透过spawns延伸出其他子程序来作为此daemon的主要服务。原生父程序在启动结束后就会终止
    • Type=oneshot:与simple类似,不过这个程序在工作完毕后就结束了,不会常驻在内存中
    • Type=dbus:与simple类似,但这个daemon必须要在取得一个D-Bus的名称后,才会继续运作.因此通常也要同时设定BusNname= 才行
    • Type=notify:在启动完成后会发送一个通知消息。还需要配合NotifyAccess 来让Systemd 接收消息
    • Type=idle:与simple类似,要执行这个daemon必须要所有的工作都顺利执行完毕后才会执行。这类的daemon通常是开机到最后才执行即可的服务
  • EnvironmentFile:环境配置文件
  • ExecStart:指明启动unit要运行命令或脚本的绝对路径
  • ExecStartPre:ExecStart前运行(启动当前服务之前执行的命令)
  • ExecStartPost:ExecStart后运行(启动当前服务之后执行的命令)
  • ExecStop:指明停止unit要运行的命令或脚本(停止当前服务时执行的命令)
  • Restart:当设定Restart=1 时,则当次daemon服务意外终止后,会再次自动启动此服务(定义何种情况 Systemd 会自动重启当前服务,可能的值包括always(总是重启)、on-success、on-failure、on-abnormal、on-abort、on-watchdog)
  • ExecReload:重启当前服务时执行的命令
  • ExecStopPost:停止当其服务之后执行的命令
  • RestartSec:自动重启当前服务间隔的秒数
  • TimeoutSec:定义 Systemd 停止当前服务之前等待的秒数
  • Environment:指定环境变量

4.2.3、[Install]:定义由“systemctl enable”以及"systemctl disable“命令在实现服务启用或禁用时用到的一些选项

[Install]通常是配置文件的最后一个区块,用来定义如何启动,以及是否开机启动。它的主要字段如下。

  • Alias:别名,可使用systemctlcommand Alias.service
  • RequiredBy:被哪些units所依赖,强依赖(它的值是一个或多个 Target,当前 Unit 激活时,符号链接会放入/etc/systemd/system目录下面以 Target 名 + .required后缀构成的子目录中)
  • WantedBy:被哪些units所依赖,弱依赖(它的值是一个或多个 Target,当前 Unit 激活时(enable)符号链接会放入/etc/systemd/system目录下面以 Target 名 + .wants后缀构成的子目录中)
  • Also:安装本服务的时候还要安装别的相关服务 注意:对于新创建的unit文件,或者修改了的unit文件,要通知systemd重载此配置文件,而后可以选择重启systemctl daemon-reload Unit 配置文件的完整字段清单,请参考官方文档
  •  Install一般填为WantedBy=multi-user.target
    注意:对于新创建的unit文件,或者修改了的unit文件,要通知systemd重载此配置文件,而后可以选择重启,使用命令 systemctl daemon-reload

四、常用命令

#语法
systemctl COMMAND name.service

#启动
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 -t 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



日志查看:
 # 查看所有日志
 journalctl
 ​
 # 查看特定服务的日志
 journalctl -u 服务名.service
 ​
 # 实时查看日志(类似于 tail -f)
 journalctl -f
 ​
 # 查看系统最近一次启动的日志
 journalctl -b

五、常见的service文件配置示例

1.nginx的unit 配置文件示例

# 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

2.redis的unit 配置文件示例

# 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=10065
NoNewPrivileges=yes
OOMScoreAdjust=-900
Type=notify
User=redis
Group=redis

[Install]
WantedBy=multi-user.target

3.mysql的unit 配置文件示例

# 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=10000
Restart=on-failure

[Install]
WantedBy=multi-user.target

4.systemd管理java进程示例

# 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 服务文件作为成功退出状态来抑制这种报错


5.prometheus的unit 配置文件示例

# 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

6.docker的unit配置文件示例

[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target docker.socket firewalld.service containerd.service time-set.target
Wants=network-online.target containerd.service
Requires=docker.socket

[Service]
Type=notify
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutStartSec=0
RestartSec=2
Restart=always
StartLimitBurst=3
StartLimitInterval=60s
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
Delegate=yes
KillMode=process
OOMScoreAdjust=-500

[Install]
WantedBy=multi-user.target





 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值