systemd:service与target使用及相关命令


文章目录

  • [一、 unit](#一、 unit)
    • [1.1 unit常用命令](#1.1 unit常用命令)
  • [二、 service系统服务](#二、 service系统服务)
    • [2.1 unit service配置文件](#2.1 unit service配置文件)
      • [2.1.1 [Unit]区块](#2.1.1 [Unit]区块)
      • [2.1.2 [Service]区块](#2.1.2 [Service]区块)
      • [2.1.3 [Install]区块](#2.1.3 [Install]区块)
      • [2.1.4 示例介绍](#2.1.4 示例介绍)
    • [2.2 service常用命令](#2.2 service常用命令)
  • 三、target
    • [3.1 tartget有关命令](#3.1 tartget有关命令)
  • 四、其他系统命令
    • [4.1 systemctl 相关系统管理命令](#4.1 systemctl 相关系统管理命令)
    • [4.2 journalctl 相关命令](#4.2 journalctl 相关命令)
    • [4.3 systemd-analyze 分析系统启动](#4.3 systemd-analyze 分析系统启动)

传统的Linux系统启动过程主要由著名的init进程(也被称为SysV init启动系统)来处理,而基于init的启动系统被认为有效率不足的问题,systemd是Linux系统机器的另一种启动方式,宣称弥补了以传统Linux SysV init为基础的系统的缺点;Systemd是用来启动守护进程,已成为大多数发行版的标准配置。

本文主要介绍systemd相关命令以及配置。


一、 unit

Systemd可以管理所有系统资源,不同的资源统称为 Unit(单位),Unit一共分成以下12种。其中最重要的是系统服务(Service )和Target,本文主要介绍这两个。

Service unit:系统服务
Target unit:多个Unit构成的一个组

Device Unit:硬件设备

Mount Unit:文件系统的挂载点

Automount Unit:自动挂载点

Path Unit:文件或路径

ScopeUnit:不是由Systemd启动的外部进程

Slice Unit:进程组

Snapshot Unit:Systemd快照,可以切回某个快照

Socket Unit:进程间通信的socket Swap Unit:swap文件 Timer Unit:定时器

1.1 unit常用命令

这里只列出可能常用的unit list相关命令

bash 复制代码
#汇总unit系统启动状态
$ systemctl status

#显示单个Unit的状态
$ sysystemctl status network.service

#列出正在运行的Unit
$ systemctl list-units

#列出所有Unit,包括没有找到配置文件的或者启动失败的
$ systemctl list-units --all

#列出所有没有运行的Unit
$ systemctl list-units --all --state=inactive

#列出所有加载失败的Unit
$ systemctl list-units --failed

#列出所有正在运行的、类型为service的Unit
$ systemctl list-units --type=service

二、 service系统服务

service作为unit特殊的一种,日常自定义添加系统服务,其配置过程是必不可少的,因此需要熟悉配置的常用属性。这里对这个常用的service系统服务单独讲解。

2.1 unit service配置文件

通过命令 systemctl cat xxx.service 可以看到对应服务的配置文件组成,通常.service配置文件分为如下3个区块。

[Unit]

...

[Service]

...

[Install]

...

2.1.1 [Unit]区块

通常是配置文件的第一个区块,用于启动顺序与依赖关系配置,以及和其他 Unit 的关系。常见字段有:

  • Description:简短描述
  • Documentation:文档地址
  • Requires:当前Unit依赖的其他Unit,如果它们没有运行,当前Unit会启动失败
  • Wants:与当前Unit配合的其他Unit,如果它们没有运行,当前Unit不会启动失败
  • BindsTo:与Requires类似,它指定的 Unit 如果退出,会导致当前Unit停止运行
  • Before:如果该字段指定的Unit也要启动,那么必须在当前Unit之后启动
  • After:如果该字段指定的Unit也要启动,那么必须在当前Unit之前启动
  • Conflicts:这里指定的Unit 不能与当前Unit同时运行
  • Condition...:当前Unit运行必须满足的条件,否则不会运行
  • Assert...:当前Unit运行必须满足的条件,否则会报启动失败

2.1.2 [Service]区块

只有Service类型的Unit才有这个区块。常用字段如下:

  • Type:定义启动时的进程行为。它有以下几种值:
    Type=simple:默认值,执行ExecStart指定的命令,启动主进程
    Type=forking:以fork方式从父进程创建子进程,创建后父进程会立即退出
    Type=oneshot:一次性进程,Systemd会等当前服务退出,再继续往下执行
    Type=dbus:当前服务通过D-Bus启动
    Type=notify:当前服务启动完毕,会通知Systemd,再继续往下执行
    Type=idle:若有其他任务执行完毕,当前服务才会运行
  • ExecStart:启动当前服务的命令
  • ExecStartPre:启动当前服务之前执行的命令
  • ExecStartPost:启动当前服务之后执行的命
  • ExecReload:重启当前服务时执行的命令
  • ExecStop:停止当前服务时执行的命令
  • ExecStopPost:停止当其服务之后执行的命令
  • RestartSec:自动重启当前服务间隔的秒数
  • Restart:定义何种情况Systemd会自动重启当前服务,可能的值包括always(总是重启)、on-success、on-failure、on-abnormal、on-abort、on-watchdog
  • TimeoutSec:定义Systemd停止当前服务之前等待的秒数
  • RemainAfterExit:当该服务的所有进程全部退出之后, 是否依然将此服务视为活动(active)状态, 默认值为 no。这个配置主要是提供给一些并非常驻内存,而是启动注册后立即退出然后等待消息按需启动的特殊类型服务使用。
  • Environment:指定环境变量

2.1.3 [Install]区块

用来定义如何启动,以及是否开机启动。它的主要字段如下。

  • WantedBy:它的值是一个或多个Target,当前Unit激活时(enable)符号链接会放入/etc/systemd/system目录下面以Target名+.wants后缀构成的子目录中
  • RequiredBy:它的值是一个或多个Target,当前Unit激活时,符号链接会放入/etc/systemd/system目录下面以Target名 + .required后缀构成的子目录中
  • Alias:当前Unit 可用于启动的别名
  • Also:当前Unit激活(enable)时,会被同时激活的其他Unit

WantedBy和RequiredBy的区别与上述[Unit]的Want和Require类似。

2.1.4 示例介绍

上面介绍的字段很多, 但实际大部分场景是用不到的,这里展示一个简单的service示例demo,方便理解(注意:注释的时候不能在每个字段的后面进行注释,否则会解析失败):

bash 复制代码
[Unit]
 #对该service的描述
Description=service demo 
#要在这些服务之后执行
After=sysinit.target network.service network.target  
#在 rc-local前完成
Before=rc-local.service 

[Service]
 #一次性进程,Systemd会等当前服务退出,再继续往下执行。如果Type=forking,则fork方式从父进程创建子进程,创建后父进程会立即退出
Type=oneshot  
#启动服务主程序前执行的命令,这个为等3s   
ExecStartPre= sleep 3 
# 所有进程服务退出后,是否任为active常驻状态
RemainAfterExit=yes
 #服务指定主程序
ExecStart=/home/demo.sh 

[Install]
#所属于muti-user target下,service enable后会在muti-user target自动创建软链接
WantedBy=multi-user.target  

2.2 service常用命令

对于service的管理通常涉及下面常用命令:

bash 复制代码
#查看服务启动状态
$ sudo systemctl status demo.service

#使能一个服务(开机自启动)
$ sudo systemctl enable demo.service

#关闭一个服务(开机不启动)
$ sudo systemctl disable demo.service

#打开这个服务对应配置文件
$ sudo systemctl cat demo.service

#立即启动一个服务
$ sudo systemctl start demo.service

#立即停止一个服务
$ sudo systemctl stop demo.service

#重启一个服务
$ sudo systemctl restart demo.service

#杀死一个服务的所有子进程
$ sudo systemctl kill demo.service

#重新加载一个服务的配置文件
$ sudo systemctl reload demo.service

#重载所有修改过的配置文件
$ sudo systemctl daemon-reload

三、target

systemd target是systemd众多资源的一个分类,以.target结尾,所代表的意思是unit集合,即.target资源包含了一系列的.service、.target等,运行这个target会运行其包含的所有.service、.target等unit/服务。

其作用就是方便系统管理,根据用户设定,控制系统启动的相关target,达到控制不同service启动的目的。

target配置文件跟上面的service配置文件是一样的,只是target通常只有[Unit]区块(字段定义同上)。常见的target有multi-user.target,日常添加系统服务非特殊情况会放到这个target下。

3.1 tartget有关命令

bash 复制代码
#查看当前系统的所有Target
$ systemctl list-unit-files --type=target

#查看一个 Target 包含的所有 Unit
$ systemctl list-dependencies demo.target

#查看启动时的默认 Target
$ systemctl get-default

#设置启动时的默认Target
$ sudo systemctl set-default multi-user.target

#关闭前一个Target里面所有不属于后一个Target的进程
$ sudo systemctl isolate multi-user.target

其中systemctl get-default 比较常用,方便查看系统默认启动的哪个target。systemctl list-dependencies 方便确认这个target组成情况。


四、其他系统命令

4.1 systemctl 相关系统管理命令

bash 复制代码
 #命令查看Systemd的版本
systemctl --version 

#重启系统
$ sudo systemctl reboot

#关闭系统,切断电源
$ sudo systemctl poweroff

#CPU停止工作
$ sudo systemctl halt

#暂停系统
$ sudo systemctl suspend

#启动进入救援状态(单用户状态)
$ sudo systemctl rescue

4.2 journalctl 相关命令

journald 是 systemd 的系统日志守护进程,它从整个系统收集日志并将日志保存在二进制文件中。journalctl工具为日志分析工具,具有丰富过滤能力,可以查看所有日志(包括内核日志和应用日志)。配置文件位于:/etc/systemd/journald.conf,日志路径:/var/log/journal/

常见命令有:

bash 复制代码
#查看所有日志(默认情况下 ,只保存本次启动的日志)
$ sudo journalctl

#查看内核日志(不显示应用日志)
$ sudo journalctl -k

#查看系统本次启动的日志
$ sudo journalctl -b
$ sudo journalctl -b -0

#查看上一次启动的日志(需更改设置)
$ sudo journalctl -b -1

#显示尾部的最新10行日志
$ sudo journalctl -n

#显示尾部指定行数的日志
$ sudo journalctl -n 20

#实时滚动显示最新日志
$ sudo journalctl -f

#查看指定进程的日志
$ sudo journalctl _PID=1

#查看某个 Unit 的日志
$ sudo journalctl -u demo.service

#查看指定优先级为err级别日志日志,
$ sudo journalctl -p err -b
	日志级别共有8级,分为:
	# 0: emerg
	# 1: alert
	# 2: crit
	# 3: err
	# 4: warning
	# 5: notice
	# 6: info
	# 7: debug
	
#显示日志占据的硬盘空间
$ sudo journalctl --disk-usage

4.3 systemd-analyze 分析系统启动

systemd-analyze可以用于分析各个systemd服务的启动基于耗时情况,方便做性能分析。

常见命令有:

bash 复制代码
#查看启动耗时
$ systemd-analyze                                                                                       

#查看每个服务的启动耗时
$ systemd-analyze blame

#查看默认目标的时间关键链的树
$ systemd-analyze critical-chain

# 图形化显示
systemd-analyze plot > boot.svg

#显示指定服务的时间关键链的树
$ systemd-analyze critical-chain atd.service

具体systemd-analyze 分析系统启动性能见下篇文章讲解。

相关推荐
G皮T8 天前
【单元测试】Controller、Service、Repository 层的单元测试
单元测试·service·controller·repository
188_djh10 天前
# bash: chkconfig: command not found 解决方法
ubuntu·debian·bash·service·systemctl·chkconfig·sysv-rc-conf
GW_Cheng13 天前
centos7将jar包制作服务并设置开机服务
java·jar·service
Rjdeng1 个月前
深入分析 Android Service (四)
android·service
Rjdeng1 个月前
深入分析 Android Service (完)
android·service
Rjdeng1 个月前
深入分析 Android Service (二)
android·service
景天科技苑1 个月前
【云原生】kubernetes中的service原理、应用实战案例解析
云原生·容器·kubernetes·k8s·服务发现·service·k8s service
诸神缄默不语2 个月前
如何使用systemctl管理自定义Python服务(Flask应用)
linux·开发语言·python·flask·网页开发·systemctl·python 3
nihao_医生2 个月前
systemctl开启自动启动特定docker服务
docker·systemctl
我想吹水2 个月前
linux systemd 的搜索路径
运维·systemd·system unit