Linux 服务管理 service systemd systemctl

Linux 服务管理 service systemd systemctl

  • 1 介绍
    • 1.1 概述
    • 1.2 发展历程
    • 1.3 特点
    • 1.4 linux 服务管理 发展历程
      • Ubuntu 14.04及更早版本:使用upstart作为默认的init系统
        • 旧版本
        • 新版本
      • Ubuntu 15.04到16.04版本:默认使用systemd作为init系统,但仍然兼容upstart
      • Ubuntu 16.10及更高版本:默认使用systemd作为init系统
  • 2 整体设计
    • 核心组件和库
  • 3 Systemd 的 Unit
    • 3.1 Systemd 支持 12 种 Unit 文件类型
    • 3.2 Systemd 目录
    • 3.3 Unit 文件结构
      • Unit 段
      • Install 段
      • Service 段
        • 服务生命周期控制相关
        • 服务上下文配置相关
      • Unit 文件占位符
      • 通过 systemctl list-units --type=target 命令可以获取当前正在使用的运行目标
    • 3.4 Unit 管理
      • 查看当前系统的所有 Unit
      • 查看 Unit 的依赖关系
    • 3.5 服务的生命周期
      • 服务的激活
      • 服务的启动和停止
      • 服务的开机启动和取消
      • 服务的修改和移除
  • 4 命令使用
    • 4.1 使用 service 命令管理服务
      • 启动服务
      • 停止服务
      • 重启服务
      • 查看服务状态
    • 4.2 使用 systemctl 命令管理服务
      • 启动服务
      • 停止服务
      • 重启服务
      • 查看服务状态
      • 杀死一个服务的所有子进程
      • 重新加载一个服务的配置文件
      • 重载所有修改过的配置文件
      • 显示某个 Unit 的所有底层参数
      • 显示某个 Unit 的指定属性的值
      • 设置某个 Unit 的指定属性
      • 设置服务开机自启
      • 禁用服务开机自启
  • 5 日志管理
  • 6 Systemd 工具集
    • systemctl
    • systemd-analyze
    • hostnamectl
    • timedatectl
    • loginctl
    • systemd-run
  • 参考

1 介绍

1.1 概述

systemd 是一个软件套件,为 Linux 操作系统提供一系列系统组件。其主要目的是统一 Linux 发行版之间的服务配置和行为。它的主要组件是“系统和服务管理器”——一个用于引导用户空间和管理用户进程的init系统。它还提供各种守护进程和实用程序的替代品,包括设备管理、登录管理、网络连接管理和事件日志记录。systemd 这个名字遵循了 Unix 命名守护进程的约定,通过在后面附加字母 d 来命名。它还利用了 “System D” 这个术语,指的是一个人快速适应和随机应变解决问题的能力。

Systemd 是一系列工具的集合,其作用也远远不仅是启动操作系统,它还接管了后台服务、结束、状态查询,以及日志归档、设备管理、电源管理、定时任务等许多职责,并支持通过特定事件(如插入特定 USB 设备)和特定端口数据触发的 On-demand(按需)任务。

自 2015 年以来,大多数 Linux 发行版都采用了 systemd,取代了 SysV init 等其他 init 系统。采用 systemd 的发行版的开发人员和用户对它赞不绝口,因为它为 Linux 领域多年来存在的问题提供了稳定、快速的开箱即用解决方案。在大多数 Linux 发行版采用 systemd 时,它是唯一一款在启动过程中提供可靠并行性以及对进程、守护进程、服务和挂载点进行集中管理的软件套件。
在这里插入图片描述

systemd 的批评者认为它存在任务蔓延和臃肿的问题,后者影响到其他软件(比如GNOME桌面),增加了对 systemd 的依赖,降低了它与其他类 Unix 操作系统的兼容性,并且使系统管理员难以集成替代解决方案。 此外,他们认为 systemd 的复杂性导致了更大的攻击面,降低了平台的整体安全性。人们还担心 Red Hat 及其母公司 IBM 控制着 Linux 上的 init 系统领域。从那时起,已经创建了许多新的分叉 Linux 发行版,它们使用替代的 init 系统,如 SysV 或 OpenRC。Systemd 还没有被 Linux 领域之外的类 Unix 系统采用,如FreeBSD、OpenBSD和Solaris。

1.2 发展历程

  • 2010年,Lennart Poettering 和 Kay Sievers 在Red Hat工作时开发了systemd,旨在取代Linux的System V init系统。他们的目标是提高系统启动效率,改进进程依赖关系管理,并减少shell计算开销。
  • 2011年5月,Fedora Linux 成为首个默认启用systemd的主流发行版,取代了Upstart。
  • 2012年10月,随后Arch Linux在2012年10月也将其设为默认,取代了SysVinit。
  • 2013-2014年,Debian 在经过激烈辩论后,于2014年2月决定采用systemd,Ubuntu也随后跟进。
  • 2014年11月,由于systemd集成争议,Debian的几位开发者辞职。
  • 2015年8月,systemd增加了登录shell功能。
  • 2016年9月,systemd被曝存在安全漏洞。
  • 2017年,又发现另一个安全问题,导致Lennart Poettering获得了“最差劲的供应商响应”奖。

1.3 特点

  • PID 值为 1
    Systemd 的后台服务有一个特殊的身份——它是系统中 PID 值为 1 的进程。

  • 更少的进程
    Systemd 提供了 服务按需启动 的能力,使得特定的服务只有在真定被请求时才启动。

  • 允许更多的进程并行启动
    在 SysV-init 时代,将每个服务项目编号依次执行启动脚本。Ubuntu 的 Upstart 解决了没有直接依赖的启动之间的并行启动。而 Systemd 通过 Socket 缓存、DBus 缓存和建立临时挂载点等方法进一步解决了启动进程之间的依赖,做到了所有系统服务并发启动。对于用户自定义的服务,Systemd 允许配置其启动依赖项目,从而确保服务按必要的顺序运行。

  • 使用 CGroup 跟踪和管理进程的生命周期
    在 Systemd 之间的主流应用管理服务都是使用 进程树 来跟踪应用的继承关系的,而进程的父子关系很容易通过 两次 fork 的方法脱离。
    而 Systemd 则提供通过 CGroup 跟踪进程关系,引补了这个缺漏。通过 CGroup 不仅能够实现服务之间访问隔离,限制特定应用程序对系统资源的访问配额,还能更精确地管理服务的生命周期。

  • 统一管理服务日志
    Systemd 是一系列工具的集合, 包括了一个专用的系统日志管理服务:Journald。这个服务的设计初衷是克服现有 Syslog 服务的日志内容易伪造和日志格式不统一等缺点,Journald 用 二进制格式 保存所有的日志信息,因而日志内容很难被手工伪造。Journald 还提供了一个 journalctl 命令来查看日志信息,这样就使得不同服务输出的日志具有相同的排版格式, 便于数据的二次处理。

1.4 linux 服务管理 发展历程

Ubuntu 14.04及更早版本:使用upstart作为默认的init系统

可以创建一个.conf文件来配置开机自启服务,然后将它放在/etc/init/目录下。

/etc/rc.local

旧版本

rc.local是一种在Ubuntu中配置开机自启服务的方式,它属于早期版本的init系统。具体来说,rc.local是在Ubuntu 14.04及更早版本中使用的方式,使用的是upstart作为默认的init系统。

rc.local是一个脚本文件,位于/etc/rc.local。你可以在该文件中添加要在系统启动时执行的命令或脚本。这些命令或脚本将在系统启动时自动执行。

以下是使用rc.local配置开机自启服务的步骤:

1 打开rc.local文件:
sudo nano /etc/rc.local

2 在文件中添加你要执行的命令或脚本。例如,如果要启动一个名为my_service的服务,可以添加以下内容:
/path/to/your/service

3 保存并关闭文件。

4 确保rc.local文件具有可执行权限:
sudo chmod +x /etc/rc.local

5 重启系统,服务将在系统启动时自动执行。

注意:rc.local方式在较新的Ubuntu版本中已经不再推荐使用,因为它是基于旧的upstart系统。对于使用systemd作为init系统的较新版本的Ubuntu,建议使用systemd的方式来配置开机自启服务。

新版本

在一些较新的Ubuntu版本中,如Ubuntu 16.04及更高版本,rc.local文件默认是被禁用的,因为这些版本使用systemd作为默认的init系统。systemd不会自动执行rc.local文件中的内容。

为了在这些版本中使用rc.local文件,可以通过配置rc-local.service来实现。rc-local.service是一个systemd服务单元,用于在系统启动时执行rc.local文件中的内容。

以下是配置rc-local.service的步骤:

1 创建rc-local.service文件:
sudo nano /etc/systemd/system/rc-local.service

2 在文件中添加以下内容:
[Unit]
Description=/etc/rc.local Compatibility
ConditionPathExists=/etc/rc.local

[Service]
ExecStart=/etc/rc.local start
Type=forking
TimeoutSec=0
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

3 创建rc.local文件
sudo nano /etc/rc.local

4 在rc.local文件中添加要执行的命令或脚本。

5 保存并关闭文件。

6 设置rc.local文件的权限:
sudo chmod +x /etc/rc.local

7 启用rc-local.service:
sudo systemctl enable rc-local.service

8 启动rc-local.service:
sudo systemctl start rc-local.service

对于较新的Ubuntu版本,使用rc.local和rc-local.service的方式可能不是最佳实践。推荐使用systemd的方式来配置开机自启服务,以便与当前的init系统保持一致。

Ubuntu 15.04到16.04版本:默认使用systemd作为init系统,但仍然兼容upstart

可以使用upstart的方式来配置开机自启服务,或者使用systemd的方式。

Ubuntu 16.10及更高版本:默认使用systemd作为init系统

可以使用systemd的方式来配置开机自启服务。

2 整体设计

核心组件和库

systemd 还提供了各种守护进程和实用程序的替代品,包括 启动 shell 脚本、pm-utils、inetd、acpid、syslog、watchdog、cron和atd。systemd的核心组件包括:

  • systemd 是 Linux 操作系统的系统和服务管理器。
  • systemctl 是一个用于检查和控制 systemd 系统和服务管理器状态的命令。不要与sysctl混淆。
  • systemd-analyze 可用于确定系统启动性能统计数据并从系统和服务管理器检索其他状态和跟踪信息。

systemd使用 Linux 内核的cgroups子系统来跟踪进程,而不是使用进程标识符(PID)。

3 Systemd 的 Unit

Systemd 可以管理所有系统资源,不同的资源统称为 Unit(单位)。

在 Systemd 的生态圈中,Unit 文件统一了过去各种不同系统资源配置格式,例如服务的启/停、定时任务、设备自动挂载、网络配置、虚拟内存配置等。而 Systemd 通过不同的文件后缀来区分这些配置文件。

3.1 Systemd 支持 12 种 Unit 文件类型

  • .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 的功能

3.2 Systemd 目录

Unit 文件按照 Systemd 约定,应该被放置指定的三个系统目录之一中。这三个目录是有优先级的,如下所示,越靠上的优先级越高。因此,在三个目录中有同名文件的时候,只有优先级最高的目录里的那个文件会被使用。

  • /etc/systemd/system:系统或用户自定义的配置文件
  • /run/systemd/system:软件运行时生成的配置文件
  • /usr/lib/systemd/system:系统或第三方软件安装时添加的配置文件。
    1)ubuntu 16:被移到了 /lib/systemd/system
    2)ubuntu 20中,目录/lib/systemd/system 和 /usr/lib/systemd/system 同时存在,这俩其实指向的是同一目录
    在这里插入图片描述

Systemd 默认从目录 /etc/systemd/system/ 读取配置文件。但是,里面存放的大部分文件都是符号链接,指向目录 /usr/lib/systemd/system/,真正的配置文件存放在那个目录。

3.3 Unit 文件结构

[Unit]
Description=Hello World
After=docker.service
Requires=docker.service
[Service]
TimeoutStartSec=0
ExecStartPre=-/usr/bin/docker kill busybox1
ExecStartPre=-/usr/bin/docker rm busybox1
ExecStartPre=/usr/bin/docker pull busybox
ExecStart=/usr/bin/docker run --name busybox1 busybox /bin/ sh -c "while true; do echo Hello World; sleep 1; done"
ExecStop="/usr/bin/docker stop busybox1"
ExecStopPost="/usr/bin/docker rm busybox1"
[Install]
WantedBy=multi-user.target
  • Unit 和 Install 段:所有 Unit 文件通用,用于配置服务(或其它系统资源)的描述、依赖和随系统启动的方式
  • Service 段:服务(Service)类型的 Unit 文件(后缀为 .service)特有的,用于定义服务的具体管理和操作方法

Unit 段

  • Description:描述这个 Unit 文件的信息
  • Documentation:指定服务的文档,可以是一个或多个文档的 URL 路径
  • Requires:依赖的其它 Unit 列表,列在其中的 Unit 模板会在这个服务启动时的同时被启动。并且,如果其中任意一个服务启动失败,这个服务也会被终止
  • Wants:与 Requires 相似,但只是在被配置的这个 Unit 启动时,触发启动列出的每个 Unit 模块,而不去考虑这些模板启动是否成功
  • After:与 Requires 相似,但是在后面列出的所有模块全部启动完成以后,才会启动当前的服务
  • Before:与 After 相反,在启动指定的任务一个模块之间,都会首先确证当前服务已经运行
  • Binds To:与 Requires 相似,失败时失败,成功时成功,但是在这些模板中有任意一个出现意外结束或重启时,这个服务也会跟着终止或重启
  • Part Of:一个 Bind To 作用的子集,仅在列出的任务模块失败或重启时,终止或重启当前服务,而不会随列出模板的启动而启动
  • OnFailure:当这个模板启动失败时,就会自动启动列出的每个模块
  • Conflicts:与这个模块有冲突的模块,如果列出的模块中有已经在运行的,这个服务就不能启动,反之亦然

Install 段

这部分配置的目标模块通常是特定运行目标的 .target 文件,用来使得服务在系统启动时自动运行。这个区段可以包含三种启动约束:

  • WantedBy:和 Unit 段的 Wants 作用相似,只有后面列出的不是服务所依赖的模块,而是依赖当前服务的模块。它的值是一个或多个 Target,当前 Unit 激活时(enable)符号链接会放入 /etc/systemd/system 目录下面以 <Target 名> + .wants 后缀构成的子目录中,如 “/etc/systemd/system/multi-user.target.wants/“
  • RequiredBy:和 Unit 段的 Wants 作用相似,只有后面列出的不是服务所依赖的模块,而是依赖当前服务的模块。它的值是一个或多个 Target,当前 Unit 激活时,符号链接会放入 /etc/systemd/system 目录下面以 <Target 名> + .required 后缀构成的子目录中
  • Also:当前 Unit enable/disable 时,同时 enable/disable 的其他 Unit
  • Alias:当前 Unit 可用于启动的别名

Service 段

用来 Service 的配置,只有 Service 类型的 Unit 才有这个区块。它的主要字段分为服务生命周期和服务上下文配置两个方面。

服务生命周期控制相关
  • Type:定义启动时的进程行为,它有以下几种值:

    • Type=simple:默认值,执行ExecStart指定的命令,启动主进程
    • Type=forking:以 fork 方式从父进程创建子进程,创建后父进程会立即退出
    • Type=oneshot:一次性进程,Systemd 会等当前服务退出,再继续往下执行
    • Type=dbus:当前服务通过D-Bus启动
    • Type=notify:当前服务启动完毕,会通知Systemd,再继续往下执行
    • Type=idle:若有其他任务执行完毕,当前服务才会运行
  • RemainAfterExit:值为 true 或 false(默认)。当配置为 true 时,Systemd 只会负责启动服务进程,之后即便服务进程退出了,Systemd 也仍然会认为这个服务还在运行中。这个配置主要是提供给一些并非常驻内存,而是启动注册后立即退出,然后等待消息按需启动的特殊类型服务使用的。

  • ExecStart:启动当前服务的命令

  • ExecStartPre:启动当前服务之前执行的命令

  • ExecStartPos:启动当前服务之后执行的命令

  • ExecReload:重启当前服务时执行的命令

  • ExecStop:停止当前服务时执行的命令

  • ExecStopPost:停止当其服务之后执行的命令

  • RestartSec:自动重启当前服务间隔的秒数

  • Restart:定义何种情况 Systemd 会自动重启当前服务,可能的值包括 always(总是重启)、on-success、on-failure、on-abnormal、on-abort、on-watchdog

  • TimeoutStartSec:启动服务时等待的秒数,这一配置对于使用 Docker 容器而言显得尤为重要,因其第一次运行时可能需要下载镜像,严重延时会容易被 Systemd 误判为启动失败杀死。通常,对于这种服务,将此值指定为 0,从而关闭超时检测

  • TimeoutStopSec:停止服务时的等待秒数,如果超过这个时间仍然没有停止,Systemd 会使用 SIGKILL 信号强行杀死服务的进程

服务上下文配置相关
  • Environment:为服务指定环境变量
  • EnvironmentFile:指定加载一个包含服务所需的环境变量的列表的文件,文件中的每一行都是一个环境变量的定义
  • Nice:服务的进程优先级,值越小优先级越高,默认为 0。其中 -20 为最高优先级,19 为最低优先级
  • WorkingDirectory:指定服务的工作目录
  • RootDirectory:指定服务进程的根目录(/ 目录)。如果配置了这个参数,服务将无法访问指定目录以外的任何文件
  • User:指定运行服务的用户
  • Group:指定运行服务的用户组
  • MountFlags:服务的 Mount Namespace 配置,会影响进程上下文中挂载点的信息,即服务是否会继承主机上已有挂载点,以及如果服务运行执行了挂载或卸载设备的操作,是否会真实地在主机上产生效果。可选值为 shared、slaved 或 private
    • shared:服务与主机共用一个 Mount Namespace,继承主机挂载点,且服务挂载或卸载设备会真实地反映到主机上
    • slave:服务使用独立的 Mount Namespace,它会继承主机挂载点,但服务对挂载点的操作只有在自己的 Namespace 内生效,不会反映到主机上
    • private:服务使用独立的 Mount Namespace,它在启动时没有任何任何挂载点,服务对挂载点的操作也不会反映到主机上
  • LimitCPU / LimitSTACK / LimitNOFILE / LimitNPROC 等:限制特定服务的系统资源量,例如 CPU、程序堆栈、文件句柄数量、子进程数量等

注意:如果在 ExecStart、ExecStop 等属性中使用了 Linux 命令,则必须要写出完整的绝对路径。对于 ExecStartPre 和 ExecStartPost 辅助命令,若前面有个 “-” 符号,表示忽略这些命令的出错。因为有些 “辅助” 命令本来就不一定成功,比如尝试清空一个文件,但文件可能不存在。

Unit 文件占位符

在 Unit 文件中,有时会需要使用到一些与运行环境有关的信息,例如节点 ID、运行服务的用户等。这些信息可以使用占位符来表示,然后在实际运行被动态地替换实际的值。

  • %n:完整的 Unit 文件名字,包括 .service 后缀名
  • %p:Unit 模板文件名中 @ 符号之前的部分,不包括 @ 符号
  • %i:Unit 模板文件名中 @ 符号之后的部分,不包括 @ 符号和 .service 后缀名
  • %t:存放系统运行文件的目录,通常是 “run”
  • %u:运行服务的用户,如果 Unit 文件中没有指定,则默认为 root
  • %U:运行服务的用户 ID
  • %h:运行服务的用户 Home 目录,即 %{HOME} 环境变量的值
  • %s:运行服务的用户默认 Shell 类型,即 %{SHELL} 环境变量的值
  • %m:实际运行节点的 Machine ID,对于运行位置每个的服务比较有用
  • %b:Boot ID,这是一个随机数,每个节点各不相同,并且每次节点重启时都会改变
  • %H:实际运行节点的主机名
  • %v:内核版本,即 “uname -r” 命令输出的内容
  • %%:在 Unit 模板文件中表示一个普通的百分号

通过 systemctl list-units --type=target 命令可以获取当前正在使用的运行目标

u20@u20:~$ systemctl list-units --type=target
  UNIT                    LOAD   ACTIVE SUB    DESCRIPTION                  
  basic.target            loaded active active Basic System                 
  bluetooth.target        loaded active active Bluetooth                    
  cryptsetup.target       loaded active active Local Encrypted Volumes      
  getty-pre.target        loaded active active Login Prompts (Pre)          
  getty.target            loaded active active Login Prompts                
  graphical.target        loaded active active Graphical Interface          
  local-fs-pre.target     loaded active active Local File Systems (Pre)     
  local-fs.target         loaded active active Local File Systems           
  multi-user.target       loaded active active Multi-User System            
  network-online.target   loaded active active Network is Online            
  network.target          loaded active active Network                      
  nss-lookup.target       loaded active active Host and Network Name Lookups
  nss-user-lookup.target  loaded active active User and Group Name Lookups  
  paths.target            loaded active active Paths                        
  remote-fs.target        loaded active active Remote File Systems          
  slices.target           loaded active active Slices

3.4 Unit 管理

查看当前系统的所有 Unit

# 列出正在运行的 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

# 查看 Unit 配置文件的内容
$ systemctl cat docker.service

查看 Unit 的依赖关系

# 列出一个 Unit 的所有依赖,默认不会列出 target 类型
$ systemctl list-dependencies nginx.service

# 列出一个 Unit 的所有依赖,包括 target 类型
$ systemctl list-dependencies --all nginx.service

3.5 服务的生命周期

当一个新的 Unit 文件被放入 /etc/systemd/system/ 或 /usr/lib/systemd/system/ 目录中时,它是不会被自识识别的。

服务的激活

  • systemctl enable:在 /etc/systemd/system/ 建立服务的符号链接,指向 /usr/lib/systemd/system/ 中
  • systemctl start:依次启动定义在 Unit 文件中的 ExecStartPre、ExecStart 和 ExecStartPost 命令

服务的启动和停止

  • systemctl start:依次启动定义在 Unit 文件中的 ExecStartPre、ExecStart 和 ExecStartPost 命令
  • systemctl stop:依次停止定义在 Unit 文件中的 ExecStopPre、ExecStop 和 ExecStopPost 命令
  • systemctl restart:重启服务
  • systemctl kill:立即杀死服务

服务的开机启动和取消

  • systemctl enable:除了激活服务以外,也可以置服务为开机启动
  • systemctl disable:取消服务的开机启动

服务的修改和移除

  • systemctl daemon-reload:Systemd 会将 Unit 文件的内容写到缓存中,因此当 Unit 文件被更新时,需要告诉 Systemd 重新读取所有的 Unit 文件
  • systemctl reset-failed:移除标记为丢失的 Unit 文件。在删除 Unit 文件后,由于缓存的关系,即使通过 daemon-reload 更新了缓存,在 list-units 中依然会显示标记为 not-found 的 Unit。

4 命令使用

4.1 使用 service 命令管理服务

启动服务

sudo service service_name start

停止服务

sudo service service_name stop

重启服务

sudo service service_name restart

查看服务状态

sudo service service_name status

4.2 使用 systemctl 命令管理服务

systemctl是基于Systemd的服务管理工具,提供了更强大的功能和更细粒度的控制。

启动服务

sudo systemctl start service_name

停止服务

sudo systemctl stop service_name

重启服务

sudo systemctl restart service_name

查看服务状态

  • enabled:已建立启动链接
  • disabled:没建立启动链接
  • static:该配置文件没有 [Install] 部分(无法执行),只能作为其他配置文件的依赖
  • masked:该配置文件被禁止建立启动链接
sudo systemctl status service_name

# 显示系统状态
$ systemctl status

# 显示单个 Unit 的状态
$ systemctl status bluetooth.service

# 显示远程主机的某个 Unit 的状态
$ systemctl -H root@rhel7.example.com status httpd.service

杀死一个服务的所有子进程

$ sudo systemctl kill apache.service

重新加载一个服务的配置文件

$ sudo systemctl reload apache.service

重载所有修改过的配置文件

$ sudo systemctl daemon-reload

显示某个 Unit 的所有底层参数

$ systemctl show httpd.service

显示某个 Unit 的指定属性的值

$ systemctl show -p CPUShares httpd.service

设置某个 Unit 的指定属性

$ sudo systemctl set-property httpd.service CPUShares=500

设置服务开机自启

sudo systemctl enable service_name

禁用服务开机自启

sudo systemctl disable service_name

5 日志管理

Systemd 通过其标准日志服务 Journald 提供的配套程序 journalctl 将其管理的所有后台进程打印到 std:out(即控制台)的输出重定向到了日志文件。

Systemd 的日志文件是二进制格式的,必须使用 Journald 提供的 journalctl 来查看,默认不带任何参数时会输出系统和所有后台进程的混合日志。

默认日志最大限制为所在文件系统容量的 10%,可以修改 /etc/systemd/journald.conf 中的 SystemMaxUse 来指定该最大限制。

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

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

# 查看系统本次启动的日志(其中包括了内核日志和各类系统服务的控制台输出):--system 或 -b
$ sudo journalctl -b
$ sudo journalctl -b -0

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

# 查看指定服务的日志:--unit 或 -u
$ sudo journalctl -u docker.servcie

# 查看指定服务的日志
$ sudo journalctl /usr/lib/systemd/systemd

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

# 查看指定时间的日志
$ sudo journalctl --since="2012-10-30 18:17:16"
$ sudo journalctl --since "20 min ago"
$ sudo journalctl --since yesterday
$ sudo journalctl --since "2015-01-10" --until "2015-01-11 03:00"
$ sudo journalctl --since 09:00 --until "1 hour ago"

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

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

# 将最新的日志显示在前面
$ sudo journalctl -r -u docker.service

# 改变输出的格式:--output 或 -o
$ sudo journalctl -r -u docker.service -o json-pretty

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

# 查看某个路径的脚本的日志
$ sudo journalctl /usr/bin/bash

# 查看指定用户的日志
$ sudo journalctl _UID=33 --since today

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

# 实时滚动显示某个 Unit 的最新日志
$ sudo journalctl -u nginx.service -f

# 合并显示多个 Unit 的日志
$ journalctl -u nginx.service -u php-fpm.service --since today

# 查看指定优先级(及其以上级别)的日志,共有 8 级
# 0: emerg
# 1: alert
# 2: crit
# 3: err
# 4: warning
# 5: notice
# 6: info
# 7: debug
$ sudo journalctl -p err -b

# 日志默认分页输出,--no-pager 改为正常的标准输出
$ sudo journalctl --no-pager

# 以 JSON 格式(单行)输出
$ sudo journalctl -b -u nginx.service -o json

# 以 JSON 格式(多行)输出,可读性更好
$ sudo journalctl -b -u nginx.serviceqq
 -o json-pretty

# 显示日志占据的硬盘空间
$ sudo journalctl --disk-usage

# 指定日志文件占据的最大空间
$ sudo journalctl --vacuum-size=1G

# 指定日志文件保存多久
$ sudo journalctl --vacuum-time=1years

6 Systemd 工具集

  • systemctl:用于检查和控制各种系统服务和资源的状态
  • bootctl:用于查看和管理系统启动分区
  • hostnamectl:用于查看和修改系统的主机名和主机信息
  • journalctl:用于查看系统日志和各类应用服务日志
  • localectl:用于查看和管理系统的地区信息
  • loginctl:用于管理系统已登录用户和 Session 的信息
  • machinectl:用于操作 Systemd 容器
  • timedatectl:用于查看和管理系统的时间和时区信息
  • systemd-analyze 显示此次系统启动时运行每个服务所消耗的时间,可以用于分析系统启动过程中的性能瓶颈
  • systemd-ask-password:辅助性工具,用星号屏蔽用户的任意输入,然后返回实际输入的内容
  • systemd-cat:用于将其他命令的输出重定向到系统日志
  • systemd-cgls:递归地显示指定 CGroup 的继承链
  • systemd-cgtop:显示系统当前最耗资源的 CGroup 单元
  • systemd-escape:辅助性工具,用于去除指定字符串中不能作为 Unit 文件名的字符
  • systemd-hwdb:Systemd 的内部工具,用于更新硬件数据库
  • systemd-delta:对比当前系统配置与默认系统配置的差异
  • systemd-detect-virt:显示主机的虚拟化类型
  • systemd-inhibit:用于强制延迟或禁止系统的关闭、睡眠和待机事件
  • systemd-machine-id-setup:Systemd 的内部工具,用于给 Systemd 容器生成 ID
  • systemd-notify:Systemd 的内部工具,用于通知服务的状态变化
  • systemd-nspawn:用于创建 Systemd 容器
  • systemd-path:Systemd 的内部工具,用于显示系统上下文中的各种路径配置
  • systemd-run:用于将任意指定的命令包装成一个临时的后台服务运行
  • systemd-stdio- bridge:Systemd 的内部 工具,用于将程序的标准输入输出重定向到系统总线
  • systemd-tmpfiles:Systemd 的内部工具,用于创建和管理临时文件目录
  • systemd-tty-ask-password-agent:用于响应后台服务进程发出的输入密码请求

systemctl

# 重启系统
$ sudo systemctl reboot

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

# CPU停止工作
$ sudo systemctl halt

# 暂停系统
$ sudo systemctl suspend

# 让系统进入冬眠状态
$ sudo systemctl hibernate

# 让系统进入交互式休眠状态
$ sudo systemctl hybrid-sleep

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

systemd-analyze

# 查看启动耗时
$ systemd-analyze

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

# 显示瀑布状的启动过程流
$ systemd-analyze critical-chain

# 显示指定服务的启动流
$ systemd-analyze critical-chain atd.service

hostnamectl

# 显示当前主机的信息
$ hostnamectl

# 设置主机名。
$ sudo hostnamectl set-hostname rhel7

timedatectl

# 查看当前时区设置
$ timedatectl

# 显示所有可用的时区
$ timedatectl list-timezones

# 设置当前时区
$ sudo timedatectl set-timezone America/New_York
$ sudo timedatectl set-time YYYY-MM-DD
$ sudo timedatectl set-time HH:MM:SS

loginctl

# 列出当前 session
$ loginctl list-sessions

# 列出当前登录用户
$ loginctl list-users

# 列出显示指定用户的信息
$ loginctl show-user ruanyf

systemd-run

systemd-run 可以将一个指定的操作变成后台运行的服务。它的效果似乎与直接在命令后加上表示后台运行的 & 符号很相似。然而,它让命令成为服务还意味着,它的生命周期将由 Systemd 控制。具体来说,包括以下好处:

  • 服务的生命击期由 Systemd 接管,不会随着启动它的控制台关闭而结束
  • 可以通过 systemctl 工具管理服务的状态
  • 可以通过 journalctl 工具查看和管理服务的日志信息
  • 可以通过 Systemd 提供的方法限制服务的 CPU、内存、磁盘 IO 等系统资源的使用情况。

参考

1、wiki–systemd
2、官网–systemd
3、Linux服务管理(详解)!
4、linux–systemd、systemctl
5、Ubuntu开机自启服务systemd.service配置教程(Ubuntu服务)(Linux服务)upstart(systemd教程)
6、可能是史上最全面易懂的 Systemd 服务管理教程!( 强烈建议收藏 )
7、Ubuntu系统如何启动、停止或重启服务。
8、ubuntu系统服务配置详解

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/942845.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue 基础学习

一、ref 和reactive 区别 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title> </head> <body><div id"app"><h1>{{Web.title}}</h1><h1&…

光谱相机在农业中的具体应用案例

作物生长监测与产量预测 美国爱荷华州玉米种植园&#xff1a;农场主使用无人机搭载高光谱相机&#xff0c;定期对玉米田进行拍摄。通过分析光谱数据&#xff0c;获取玉米的叶面积指数、叶绿素含量等生长参数。在玉米生长关键期&#xff0c;依据这些参数及时调整施肥和灌溉方案…

LSTM-SVM时序预测 | Matlab基于LSTM-SVM基于长短期记忆神经网络-支持向量机时间序列预测

LSTM-SVM时序预测 | Matlab基于LSTM-SVM基于长短期记忆神经网络-支持向量机时间序列预测 目录 LSTM-SVM时序预测 | Matlab基于LSTM-SVM基于长短期记忆神经网络-支持向量机时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.LSTM-SVM时序预测 | Matlab基于LSTM…

05.HTTPS的实现原理-HTTPS的握手流程(TLS1.2)

05.HTTPS的实现原理-HTTPS的握手流程&#xff08;TLS1.2&#xff09; 简介1. TLS握手过程概述2. TLS握手过程细化3. 主密钥&#xff08;对称密钥&#xff09;生成过程4. 密码规范变更 简介 主要讲述了混合加密流程完成后&#xff0c;客户端和服务器如何共同获得相同的对称密钥…

PostgreSQL编译安装教程

下载安装 1.在家目录创建一个文件夹放下载安装包 mkdir softwarecd software 2.下载文件压缩包 wget https://ftp.postgresql.org/pub/source/v16.0/postgresql-16.0.tar.gz 3.解压 tar -xzvf postgresql-16.0.tar.gz 4.编译 在software/postgresql-16.0下 cd software…

009-spring-bean的实例化流程

1 spring容器初始化时&#xff0c;将xml配置的bean 信息封装在 beandefinition对象 2 所有的beandefinition存储在 beandefinitionMap的map集合中 3 spring对map进行遍历&#xff0c;使用反射创建bean实例对象 4 创建好的bean存在名为singletonObjects的map集合中 5 调用ge…

定位方式:css

使用相对路径 div ul #div下的所有ul&#xff0c;空格表示相对路径&#xff08;这个实际中用的多一些&#xff09; 绝对路径-一般不用绝对路径 html>head>div&#xff0c;“>”表示根路径 使用class名称定位 使用.表示 使用id定位 使用#表示 使用属性定位 [属性名…

基于深度学习(HyperLPR3框架)的中文车牌识别系统-搭建开发环境

本篇内容为搭建开发环境。包括&#xff1a;python开发环境&#xff0c;Qt/C开发环境&#xff0c;以及用到的各个库的安装和配置。 一、Python开发环境搭建与配置 1、下载并安装Anaconda 我没有用最新的版本&#xff0c;安装的是 Anaconda3-2021.05-Windows-x86_64.exe&#…

kamailio.cfg 图形化

kamailio.cfg 文件随着业务增加&#xff0c;会越来越大&#xff0c;越来越复杂&#xff0c;很难看出整体结构来。 有没有什么工具看出整体轮廓呢?有。主要依靠下面的python文件&#xff1a; python脚本 调用命令如下&#xff1a; python3 route_graph.py kamailio.cfg 执…

【Linux】进程控制,手搓简洁版shell

⭐️个人主页&#xff1a;小羊 ⭐️所属专栏&#xff1a;Linux 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 1、进程创建2、进程终止3、进程等待4、进程程序替换5、手写简洁版shell 1、进程创建 fork函数&#xff1a;从已经存在的进程中创…

rabbitmq相关使用

使用rabbitmq实现异步解耦 使用步骤&#xff1a; 1、pom依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId> </dependency> 2、yml配置文件 spring:rabbitmq:host: 12…

单机和微服务的区别,微服务有什么问题?数据一致性问题怎么解决?幂等问题怎么解决?

单机和微服务的区别&#xff0c;微服务有什么问题&#xff1f;数据一致性问题怎么解决&#xff1f;幂等问题怎么解决&#xff1f; 单机架构和微服务架构在设计理念、部署和扩展性上有显著区别。 单机架构 vs 微服务架构 单机架构 定义&#xff1a;所有组件&#xff08;前端…

VUE3+django接口自动化部署平台部署说明文档(使用说明,需要私信)

网址连接&#xff1a;http://118.25.110.213:5200/#/login 账号/密码&#xff1a;renxiaoyong 1、VUE3部署本地。 1.1本地安装部署node.js 1.2安装vue脚手架 npm install -g vue/cli # 或者 yarn global add vue/cli1.3创建本地项目 vue create my-vue-project1.4安装依赖和插…

overleaf中出现TeX capacity exceeded PDF object stream buffer=5000000的原因和解决方案

在插入pdf 配图后&#xff0c;编译出错提示信息如图&#xff0c;很可能的一个原因是pdf文件大小太大了&#xff0c;最好压缩一下&#xff0c;压缩到1MB以内。

Golang的并发编程问题解决

Golang的并发编程问题解决 第一部分&#xff1a;Golang并发编程基础 并发与并行 在计算机领域&#xff0c;经常会听到并发和并行这两个词语。简单来说&#xff0c;并发是指在单处理器上通过时间片轮转实现多任务同时执行&#xff0c;而并行则是指多个任务在多个处理器上同时执行…

【玩转MacBook】Maven安装

下载Maven 官网&#xff1a; https://maven.apache.org/download.cgi 下载 Zip 类型的压缩包&#xff1a; 配置环境变量 以管理员身份编辑配置文件。注意&#xff0c;由于 MacBook 上使用了 zsh 命令行&#xff0c;所以需要编辑~/.zshrc文件而不是~/.bash_profile文件&am…

MySQL数据库(锁)

1、MySQL有哪些锁&#xff1f; 全局锁&#xff1a;flush tables with read lock 执行以下语句之后&#xff0c;使用全局锁&#xff0c;整个数据库就处于只读状态了&#xff0c;这时其他线程执行对数据的增删改或者对表结构的更改操作操作&#xff0c;都会被阻塞。 全局锁的应…

HarmonyOS NEXT 实战之元服务:静态案例效果(二)

背景&#xff1a; 前几篇学习了元服务&#xff0c;后面几期就让我们开发简单的元服务吧&#xff0c;里面丰富的内容大家自己加&#xff0c;本期案例 仅供参考 先上本期效果图 &#xff0c;里面图片自行替换 效果图代码案例如下&#xff1a; Index里面实现 import { authent…

EndtoEnd Object Detection with Transformers

全文摘要 本文介绍了一种新的物体检测方法——DETR&#xff08;DEtection TRansformer&#xff09;&#xff0c;该方法将物体检测视为直接的集合预测问题&#xff0c;并通过使用基于transformer的编码器解码器架构和一种集 论文方法 方法描述 该论文提出了一种名为DETR&…

第二十六周机器学习笔记:PINN求正反解求PDE文献阅读——正问题

第二十六周周报 摘要Abstract文献阅读《Physics-informed neural networks: A deep learning framework for solving forward and inverse problems involving nonlinear partial differential equations》1. 引言2. 问题的设置3.偏微分方程的数据驱动解3.1 连续时间模型3.1.1 …