加载中...

linux中systemctl详解及常用命令


systemctl和service命令的区别

systemctlservice 两个命令都是 Linux 系统中用于管理服务的工具,但它们分别关联着不同的初始化系统(init system),并且在功能和使用场景上有所差异。

service 命令

  • 关联的初始化系统:service 命令通常与 SysV init 系统相关联,这是一个较早的初始化系统,在很多传统或较老版本的 Linux 发行版中使用。
  • 功能:通过调用 /etc/init.d/ 目录下的服务脚本来管理服务,支持的操作包括启动(start)、停止(stop)、重启(restart)等。
  • 局限性:相比 systemctlservice 提供的功能较为基础,对于服务的状态查询等高级功能支持有限,而且不直接支持 systemd 的一些特性,如 .target、sockets等。

systemctl 命令

  • 关联的初始化系统:systemctl 是 systemd 初始化系统的组成部分,systemd 在现代 Linux 发行版中广泛使用,如 Fedora、Ubuntu(从 15.04 版本起)、CentOS/RHEL 7 及以后版本等。
  • 功能:提供更强大和灵活的服务管理能力,除了基本的启动、停止、重启之外,还可以查看服务状态、设置开机启动、管理系统目标(targets)、处理日志、管理 sockets 和 timers 等。
  • 状态信息:systemctl 能够通过 systemd 的状态管理系统提供更详细和准确的服务状态信息,直接与 systemd 的数据库交互,而不是通过执行脚本获取状态。
  • 集成性:systemd 强调服务之间的依赖管理,以及对整个系统状态的统一控制,systemctl 是这一理念的具体体现,它使得服务管理更加自动化和高效。

它们的关系

  • 兼容性:在使用 systemd 的系统中,为了向后兼容,service 命令通常仍然可用,但它实际上可能只是 systemctl 的一个简单封装,调用 systemctl 来执行操作。
  • 推荐使用:虽然 service 命令在某些情况下仍然可用,但鉴于 systemctl 的强大功能和现代 Linux 发行版普遍采用 systemd,推荐使用 systemctl 进行服务管理。

综上所述,systemctlservice 都服务于管理 Linux 系统服务的目的,但 systemctl 更符合现代 Linux 系统的管理需求,特别是在基于 systemd 的系统中。

systemctl使用

  • 启动和停止服务:

    要启动一个服务,可以使用以下命令:

    sudo systemctl start <service-name>

    要停止一个服务,可以使用以下命令:

    sudo systemctl stop <service-name>

    替换 <service-name> 为你要启动或停止的服务的名称。

  • 重启服务:

    要重启一个服务,可以使用以下命令:

    sudo systemctl restart <service-name>
  • 重新加载服务配置:

    如果你修改了一个服务的配置文件,你可以使用以下命令来重新加载服务的配置,以使更改生效:

    sudo systemctl reload <service-name>
  • 查看服务状态:

    要查看特定服务的状态,可以运行以下命令:

    systemctl status <service-name>

    这将显示服务的详细信息,包括它是否正在运行,以及最近的日志消息。

  • 启用和禁用服务:

    要在系统启动时自动启动一个服务,可以使用以下命令:

    sudo systemctl enable <service-name>

    要禁用一个服务,以防止它在系统启动时自动启动,可以使用以下命令:

    sudo systemctl disable <service-name>
  • 查看系统中所有的服务状态:

    要查看系统中所有的服务状态,可以运行以下命令:

    systemctl list-units --type=service

    这将列出所有正在运行的服务以及它们的状态,包括已启动(active)、已停止(inactive)、已禁用(disabled)等。

  • 列出所有已启用的服务:

    要查看系统中所有已启用的服务,可以运行以下命令:

    systemctl list-unit-files --type=service
  • 查看系统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

systemctl命令管理systemd的资源Unit

Systemd的Unit(服务单元文件)存储在以下两个目录中。

  • /usr/lib/systemd/system/ :用户软件包安装的单元
  • /etc/systemd/system/:系统管理员安装的单元,优先级更高)

主要有四种类型文件:.mount.service.target.wants

  • .mount 文件:

    .mount 文件定义了一个挂载点,[Mount] 节点里配置了 What, Where, Type 三个数据项:

    /usr/lib/systemd/system/tmp.mount文件示例:

    [Mount]
    What=tmpfs
    Where=/tmp
    Type=tmpfs
    Options=mode=1777,strictatime,nosuid,nodev

    等同于以下命令:

    mount -t tmpfs /tmp tmpfs
  • .service 文件:

    .service 文件定义了一个服务,分为 [Unit][Service][Install] 三个小节。

    [Unit]
    Description=OpenSSH server daemon             # 描述信息,通常只是简短的一句话。
    Documentation=man:sshd(8) man:sshd_config(5)  # 指定服务的文档,可以是一个或多个文档的URL路径。
    After=network.target sshd-keygen.target       # 在xxx启动后才启动
    Wants=sshd-keygen.target                      # 与其它 Unit 的弱依赖关系
    
    [Service]
    Type=notify
    EnvironmentFile=-/etc/sysconfig/sshd      # 变量所在文件
    ExecStart=/usr/sbin/sshd -D $OPTIONS      # 执行启动脚本
    ExecReload=/bin/kill -HUP $MAINPID        # 重新加载服务文件所需执行的主要命令
    KillMode=process                          # 定义 Systemd 如何停止服务
    Restart=on-failure                        # fail时重启
    RestartSec=42s                            # Systemd 重启当前服务间隔的秒数
    
    [Install]
    WantedBy=multi-user.target                # 多用户模式下需要的
  • .target 文件:

    .target 定义了一些基础的组件,供 .service 文件调用。

  • .wants 文件:

    .wants 文件定义了要执行的文件集合,每次执行,.wants 文件夹里面的文件都会执行。

.service 配置文件参数详解

需要开机不登陆就能运行的程序的systemctl脚本,存在系统服务里,即:/usr/lib/systemd/system/或/lib/systemd/system/目录下,不需开机就登录的程序的脚本存放在:/usr/lib/systemd/user。
每一个服务以 .service 结尾,一般会分为3部分:[Unit][Service][Install],各自的参数含义如下:

启动过程:https://www.freedesktop.org/software/systemd/man/latest/bootup.html#System%20Manager%20Bootup

1. [Unit]

所有 Unit 文件通用, 该部分主要是对这个服务的说明,以及配置与其他服务的关系。
参数详解如下:

  • Description: 一段描述这个 Unit 文件的文字,通常只是简短的一句话。
  • Documentation:指定服务的文档,可以是一个或多个文档的URL路径。
  • Requires:与其它 Unit 的强依赖关系,如果其中任意一个 Unit 启动失败或异常退出,当前 Unit 也会被退出。
  • Wants:与其它 Unit 的弱依赖关系,如果其中任意一个 Unit 启动失败或异常退出,不影响当前 Unit 继续执行。
  • After:该字段指定的 Unit 全部启动完成以后,才会启动当前 Unit。
  • Before:与 After 相反,在启动指定的任一个模块之前,都会首先确保当前服务已经运行。
    注意:Before=, After= 是配置服务间的启动顺序,比如一个 foo.service 包含了一行 Before=bar.service,那么当他们同时启动时,bar.service 会等待 foo.service 启动完成后才启动。注意这个设置和 Requires= 的相互独立的,同时包含 After= 和 Requires= 也是常见的。此选项可以指定多次,然后按顺序全部启动
  • Conflicts:与这个模块有冲突的模块,如果列出模块中有已经在运行的,这个服务就不能启动,反之亦然。
    注意:如果这里列出的服务启动,那么本服务就会停止,反之亦然 ,即后启动的才起作用。注意,此设置和 After= 和 Before= 是互相独立的。
  • OnFailure:当这个模块启动失败时,就自动启动列出的每个模块。
  • BindsTo:与 Requires 相似,该字段指定的 Unit 如果退出,会导致当前 Unit 停止运行
  • PartOf :该参数仅作用于单元的停止或重启。其含义是,当停止或重启这里列出的某个单元时, 也会同时停止或重启该单元自身。 注意,这个依赖是单向的, 该单元自身的停止或重启并不影响这里列出的单元。如果 a.service 中包含了 PartOf=b.service ,那么这个依赖关系将在 b.service 的属性列表中显示为 ConsistsOf=a.service 。 也就是说,不能直接设置 ConsistsOf= 依赖。

2. [Service]

Service 段是服务(Service)类型的 Unit 文件(后缀为 .service)特有的,用于定义服务的具体管理和执行动作:

2.1 启动类型

  • Type:定义启动时的进程行为。它有以下几种值。

    Type=simple:默认值,ExecStart字段启动的进程为主进程
    服务进程不会 fork,如果该服务要启动其他服务,不要使用此类型启动,除非该服务是 socket 激活型

    Type=forking:ExecStart字段将以fork()方式从父进程创建子进程启动,创建后父进程会立即退出,子进程成为主进程。
    通常需要指定PIDFile字段,以便 Systemd 能够跟踪服务的主进程

    对于常规的守护进程(daemon),除非你确定此启动方式无法满足需求,使用此类型启动即可

    Type=oneshot:只执行一次,Systemd 会等当前服务退出,再继续往下执行, 适用于只执行一项任务、随后立即退出的服务
    通常需要指定RemainAfterExit=yes字段,使得 Systemd 在服务进程退出之后仍然认为服务处于激活状态

    Type=dbus:当前服务通过 D-Bus 信号启动。当指定的 BusName 出现在 DBus 系统总线上时,Systemd认为服务就绪

    Type=notify:当前服务启动完毕会发出通知信号,通知 Systemd,然后 Systemd 再启动其他服务

    Type=idle:Systemd 会等到其他任务都执行完,才会启动该服务。一种使用场合是:让该服务的输出,不与其他服务的输出相混合。

2.2 启动行为

  • ExecStart:指定服务启动的主要命令,在每个配置文件中只能使用一次。需要使用绝对路径。
  • ExecStartPre:指定在启动执行 ExecStart 的命令前的准备工作,可以有多个,所有命令会按照文件中书写的顺序依次被执行。
  • ExecStartPost: 指定在启动执行 ExecStart 的命令后的收尾工作,也可以有多个。
  • ExecReload:重新加载服务文件所需执行的主要命令。需要使用绝对路径。
  • ExecStop: 停止服务所需要执行的主要命令。需要使用绝对路径。
  • ExecStopPost:指定在 ExecStop 命令执行后的收尾工作,也可以有多个。
  • RemainAfterExit:当前服务的所有进程都退出的时候,Systemd 仍认为该服务是激活状态, 这个配置主要是提供给一些并非常驻内存,而是启动注册后立即退出,然后等待消息按需启动的特殊类型服务使用的。
  • TimeoutSec:定义 Systemd 停止当前服务之前等待的秒数

2.3 重启行为

  • RestartSec:如果服务需要被重启,这个参数的值为服务被重启前的等待秒数。注意,该重启等待时间只针对上面Restart的参数值起作用时的重启才有效,比如说:因Unit段配置的关系或者人为使用systemctl restart命令导致该服务重启时,该参数无效,会马上重启。
  • Restart:这个值用于指定在什么情况下需要重启服务进程,值如下:
    • no(默认值):退出后不会重启
    • always:除了用systemctl stop 或等价的服务停止操作命令,其他情况都可以重启
    • on-success:只有正常退出时(退出状态码为0),才会重启
    • on-failure:非正常退出时(退出状态码非0),包括被信号终止和超时,才会重启(守护进程,推荐值)
    • on-abnormal:只有被信号终止和超时,才会重启(对于允许发生错误退出的服务,推荐值)
    • on-abort:只有在收到没有捕捉到的信号终止时,才会重启
    • on-watchdog:超时退出,才会重启
  • KillMode:定义 Systemd 如何停止服务,可能的值包括:
    • control-group(默认值):当前控制组里面的所有子进程,都会被杀掉
    • process:只杀主进程(sshd 服务,推荐值)
    • mixed:主进程将收到 SIGTERM 信号,子进程收到 SIGKILL 信号
    • none:没有进程会被杀掉,只是执行服务的 stop 命令。

2.4 上下文相关

  • PIDFile:指向当前服务 PID file 的绝对路径。
  • User:指定运行服务的用户,会影响服务对本地文件系统的访问权限。可使用root
  • Group:指定运行服务的用户组,会影响服务对本地文件系统的访问权限。
  • Environment: 为服务添加环境变量。
  • EnvironmentFile:指定当前服务的环境参数文件。文件中的每一行都是一个环境变量的定义(key=value键值对)。
  • Nice:服务的进程优先级,值越小优先级越高,默认为0。-20为最高优先级,19为最低优先级。
  • WorkingDirectory:指定服务的工作目录。
  • RootDirectory:指定服务进程的根目录(/目录),如果配置了这个参数后,服务将无法访问指定目录以外的任何文件。
  • PrivateTmp:是否给服务分配独立的临时空间(true/false)

3. [Install]

Install 段是服务的安装信息,它不在 systemd 的运行期间使用,只在使用 systemctl enable 和 systemctl disable 命令启用/禁用服务时有用,所有 Unit 文件通用,用来定义如何启动,以及是否开机启动,参数详解如下:

  • WantedBy:它的值是一个或多个 target,执行 enable 命令时,符号链接会放入 /etc/systemd/system 目录下以 target 名 + .wants后缀 构成的子目录中。

    WantedBy=multi-user.target 表明当系统以多用户方式(默认的运行级别)启动时,这个服务需要被自动运行。当然还需要 systemctl enable 激活这个服务以后自动运行才会生效

  • RequiredBy:依赖当前服务的模块。它的值是一个或多个 target,执行enable命令时,符号链接会放入 /etc/systemd/system 目录下以 target 名 + .required后缀 构成的子目录中。

  • Alias:当前 Unit 可用于启动的别名。

  • Also:当前 Unit 被 enable/disable 时,会被同时操作的其他 Unit。

systemctl 添加自定义服务

要添加自定义服务到 Systemd,你需要创建一个 Systemd 服务单元文件,然后通过 systemctl 命令来启用和管理该服务。

下面是添加自定义服务的一般步骤:

  1. 创建服务单元文件

    你可以创建一个新的服务单元文件,例如 my_custom_service.service,使用以下命令:

    sudo vim /usr/lib/systemd/system/my_custom_service.service

    在这个文件中,你需要定义服务的配置。以下是一个简单的示例:

    [Unit]
    Description=My Custom Service
    After=network.target
    
    [Service]
    ExecStart=/path/to/your/custom/script
    
    [Install]
    WantedBy=multi-user.target
    • Description:描述服务的信息。
    • After:指定服务应该在哪个系统目标(target)之后启动。
    • ExecStart:指定要执行的自定义脚本或命令。
    • WantedBy:指定服务应该在哪个系统目标中启用。
  2. 保存并退出编辑器

  3. 重新加载 Systemd 配置:

    在创建或修改服务单元文件后,需要重新加载 Systemd 配置以使更改生效。运行以下命令:

    sudo systemctl daemon-reload

END!

本文参考链接:

systemd和systemctl详解:https://www.liuvv.com/p/c9c96ac3.html

linux中systemctl命令理解以及.service文件参数解析:https://blog.csdn.net/weixin_45606237/article/details/124727920


文章作者: 无夜
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 无夜 !
评论
  目录