215. sytemctl

systemctl

Systemd服务管理器是一款强大而灵活的工具。它用于管理系统服务和控制系统状态。

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

在一般的使用场景下,每一个 Unit(服务等) 都有一个配置文件,告诉 Systemd 怎么启动这个 Unit 。

语法格式

1
systemctl 参数 [动作] [服务名]

常用参数

-a 显示所有单位
-f 覆盖任何冲突的符号链接
-H 设置要连接的主机名
-M 设置要连接的容器名
-n 设置要显示的日志行数
-o 设置要显示的日志格式
-q 静默执行模式
-r 显示本地容器的单位
-s 设置要发送的进程信号
-t 设置单元类型
–help 显示帮助信息
–version 显示版本信息

常用动作

start 启动服务
stop 停止服务
restart 重启服务
enable 设置服务开机自启
disable 取消服务开机自启
status 查看服务状态
list 显示所有已启动服务

service文件存放位置

systemd的使用大幅提高了系统服务的运行效率, 而unit的文件位置一般主要有三个目录:

Load path when running in system mode (–system)

path description
/etc/systemd/system Local configuration
/run/systemd/system Runtime units
[/usr]/lib/systemd/system Units of installed packages

因为/lib链接到/usr/lib: lrwxrwxrwx 1 root root 7 Aug 9 2022 lib -> usr/lib

所以 /lib/systemd/system <==> /usr/lib/systemd/system

目录存放文件类型

  • [/usr]/lib/systemd/system/

    该目录中包含的是软件包安装的单元,也就是说通过yum、dnf、rpm等软件包管理命令管理的systemd单元文件,都放置在该目录下。

    [/usr]/lib/systemd/system/ The expectation is that /lib/systemd/system is a directory that should only contain systemd unit files which were put there by the package manager (YUM/DNF/RPM/APT/etc).

  • /etc/systemd/system/

    (系统管理员安装的单元, 优先级更高)

    Files in /etc/systemd/system are manually placed here by the operator of the system for ad-hoc software installations that are not in the form of a package. This would include tarball type software installations or home grown scripts.

    Systemd 默认从目录/etc/systemd/system/读取配置文件。但是,里面存放的大部分文件都是符号链接,指向目录/usr/lib/systemd/system/,真正的配置文件存放在这个目录。 systemctl enable命令用于在上面两个目录之间,建立符号链接关系。

    因此:

    1
       

    <=等同于=>

    1
    2
    3
    4
    5
    sudo systemctl enable clamd@scan.service

    #### <==等价于==>

    sudo ln -s '/usr/lib/systemd/system/clamd@scan.service' '/etc/systemd/system/multi-user.target.wants/clamd@scan.service'

    如果配置文件里面设置了开机启动,systemctl enable命令相当于激活开机启动。与之对应的,systemctl disable命令用于在两个目录之间,撤销符号链接关系,相当于撤销开机启动。

    1
    $ sudo systemctl disable clamd@scan.service

    虽然在/etc/systemd/system/目录下放置的是系统管理员安装的单元,但是实际使用过程中,用户可以自定义服务配置文件,并且放置在该目录,将该服务的配置文件的优先级提高。

优先级

这三个目录的配置文件优先级依次从高到低,如果同一选项三个地方都配置了,优先级高的会覆盖优先级低的。

系统安装时,默认会将unit文件放在/lib/systemd/system目录。如果我们想要修改系统默认的配置,比如nginx.service,一般有两种方法:

  1. /etc/systemd/system目录下创建nginx.service文件,里面写上我们自己的配置。
  2. /etc/systemd/system下面创建nginx.service.d目录,在这个目录里面新建任何以.conf结尾的文件,然后写入我们自己的配置。推荐这种做法。

/run/systemd/system这个目录一般是进程在运行时动态创建unit文件的目录,一般很少修改,除非是修改程序运行时的一些参数时,即Session级别的,才在这里做修改。

附录

服务设定位置

  • [/usr]/lib/systemd/system/
  • /etc/systemd/system/(一般为链接文件)
  • /run/systemd/system/

服务统一管理

systemd

service设定文件

路径 说明
/usr/lib/systemd/system/*.service 预设设定文件
/etc/systemd/system/system/*.service.d/ 用户个性化设定文件,会被加入设定
/etc/systemd/system/system/*.service.wants/ 连结文件,启动该服务后推荐启动的其他服务
/etc/systemd/system/system/*.service.requires/ 连结文件,启动该服务之前,需要预先启动的服务
/run/systemd/generator.late 使用 systemd-sysv-generator 工具处理 SysV init脚本(即:/etc/init.d/* ),自动生成.service文件

创建Service文件

要创建一个Systemd服务,您需要遵循以下步骤:

  1. 使用文本编辑器在创建一个新的Service文件,例如my_service.service

    1
    sudo vim /lib/systemd/system/my_service.service
  2. 在打开的文件中,添加以下内容:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    [Unit]
    Description=My Service
    After=network.target

    [Service]
    ExecStart=/path/to/your/command

    [Install]
    WantedBy=default.target

    确保根据您的实际需求修改Description字段,并将ExecStart字段修改为您要执行的命令的路径。

  3. 保存并关闭文件。

使用systemctl管理Service

一旦创建了Service文件,您可以使用systemctl命令来管理和控制您的服务。

  1. 重新加载systemd配置。

    执行以下命令,重新加载systemd配置,以使新创建的Service生效:

    1
    sudo systemctl daemon-reload
  2. 启动Service。

    执行以下命令,启动您创建的Service:

    1
    sudo systemctl start my_service
  3. 停止Service。

    要停止正在运行的Service,可以使用以下命令:

    1
    sudo systemctl stop my_service
  4. 重启Service。

    如果需要重启Service,可以使用以下命令:

    1
    sudo systemctl restart my_service
  5. 查询Service状态。

    要获取Service的当前状态,可以使用以下命令:

    1
    sudo systemctl status my_service
  6. 设置开机自启。

    如果希望Service在系统启动时自动启动,执行以下命令:

    1
    sudo systemctl enable my_service

    这样,您的Service将在系统启动时自动启动

  7. 取消开机启动

    1
    sudo systemctl disable my_service
  8. 重新加载服务

    必须在服务启动的情况下,重新加载服务,不然报错,它并不支持所有的服务,比如 network

    1
    sudo systemctl reload  my_service
  9. 查看服务是否设置成开机启动

    看输出结果,就知道是否是开机启动,enabled 代表开机启动,disabled 代表开机不启动

    1
    sudo systemctl is-enabled my_service
  10. 注销指定服务

    注销服务后,服务就没法启用了,这对于禁用高危服务相当有用

    1
    sudo systemctl mask my_service
  11. 取消注销指定服务

    重新启用注销的服务

    1
    sudo systemctl unmask my_service
  12. 列出所有可用单元

    1
    sudo systemctl list-unit-files
  13. 列出所有已启动的服务列表信息

    1
    sudo systemctl list-units --type=service

总结起来,通过创建和管理Systemd服务,您可以更好地控制和管理Linux系统中的各种服务。systemctl命令是一个强大而灵活的工具,可以启动、停止、重启和查询服务的状态。随着对systemctl命令的深入理解,您将能够更好地管理和维护Linux系统。

常用命令汇总

命令 说明
systemctl start xxx.service 启动服务
systemctl stop xxx.service 关闭服务
systemctl restart xxx.service 重启服务
systemctl status xxx.service 显示服务的状态
systemctl enable xxx.service 在开机时启用服务
systemctl disable xxx.service 在开机时禁用服务
systemctl is-enabled xxx.service 查看服务是否开机启动
systemctl list-dependencies xxx.service 查看服务有哪些依赖项
`systemctl list-unit-files grep enabled`
systemctl --failed 查看启动失败的服务列表
systemctl reload xxx.service 重新加载一个服务的配置文件
systemctl daemon-reload 重载所有修改过的配置文件
journalctl -xe 查看systemctl服务相关日志

示例

引用