systemctl命令详解

systemctl是Linux系统上用来管理和查看服务的工具,简单来说就是控制和管理系统。现在大部分的系统都打包了这个工具,所以学会使用systemctl对使用Linux有很大的帮助。

管理Services

systemd在Linux内核启动后初始化用户组件,并在系统的整个生命周期中不断维护这些组件。这些任务称为服务单元,每个服务单元配置文件都有一个对应的服务单元文件。服务单元可能涉及安装存储设备(.mount),配置硬件(.device),套接字(.socket),或者(如本指南中所述)管理服务(.service)。

启动和停止Service

systemd在当前会话中启动服务,使用以下start命令:

sudo systemctl start apache2.service

相反,要停止systemd服务,使用以下stop命令:

sudo systemctl stop apache2.service

在上面的示例中,我们启动然后停止了Apache服务。重要的是要注意,在使用服务单元时systemctl不需要.service扩展。以下是可以接受的:

sudo systemctl start apache2

如果需要重新启动服务(例如重新加载配置文件),则可以使用以下restart命令:

sudo systemctl restart apache2

同样,如果服务不需要重新启动即可重新加载其配置,则可以使用以下reload命令:

sudo systemctl reload apache2

最后,reload-or-restart如果不确定应用程序是需要重新启动还是只是重新加载,则可以使用该命令。

sudo systemctl reload-or-restart apache2

服务开机启动

上面的命令对于在单个会话中管理服务非常有用,但是在启动时也需要许多服务。要在启动时启用服务:

sudo systemctl enable nginx

要从启动时禁用该服务,使用以下disable命令:

sudo systemctl disable nginx

注意

enable命令不会在当前会话中启动服务,也不会在当前会话中disable停止服务。要同时启用/禁用和启动/停止服务,请将命令与--now开关结合使用:

sudo systemctl enable nginx --now

如果服务单元文件不在已知systemd文件路径之一内,则可以提供要启用的服务单元文件的文件路径:

sudo systemctl enable /path/to/myservice.service

但是,此文件需要systemd在启动时进行访问。例如,/home/var`不允许开机启动,除非这些目录位于根文件系统上。

检查服务状态

systemctl 使我们可以检查单个服务的状态:

systemctl status mysql

这将导致出现类似于以下输出的消息:

● mysql.service - MySQL Community Server
      Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled)
      Active: active (running) since Thu 2018-08-30 09:15:35 EDT; 1 day 5h ago
    Main PID: 711 (mysqld)
        Tasks: 31 (limit: 2319)
      CGroup: /system.slice/mysql.service
              └─711 /usr/sbin/mysqld --daemonize --pid-file=/run/mysqld/mysqld.pid

您还可以使用is-activeis-enabledis-failed监视服务状态:

systemctl is-enabled mysql

要查看systemd系统上当前正在激活的服务单元,使用以下list-units命令并按服务类型进行过滤:

systemctl list-units --type=service

注意

list-unitssystemctl命令的默认操作,因此您只需输入systemctl即可检索服务单元配置文件列表。

生成的列表包括所有当前活动的服务单元,具有待处理作业的服务单元以及活动和失败的服务单元:

UNIT                            LOAD   ACTIVE SUB       DESCRIPTION
accounts-daemon.service         loaded active running   Accounts Service
apparmor.service                loaded active exited    AppArmor initialization
apport.service                  loaded active exited    LSB: automatic crash report generation
atd.service                     loaded active running   Deferred execution scheduler
blk-availability.service        loaded active exited    Availability of block devices
console-setup.service           loaded active exited    Set console font and keymap
cron.service                    loaded active running   Regular background program processing daemon
dbus.service                    loaded active running   D-Bus System Message Bus
ebtables.service                loaded active exited    ebtables ruleset management
...

输出提供五段数据:

  • 服务单元:服务单元名称。
  • LOAD:服务单元是否正确加载?
  • ACTIVE:一般的激活状态,即SUB的概括。
  • SUB:低级服务单元激活状态,其值取决于服务单元类型。
  • 描述:服务单元的描述。

要列出所有服务单元,包括无效服务单元,请附加--all标志:

systemctl list-units --type=service --all

您可以按状态过滤服务单元列表。提供以逗号分隔的服务单元状态列表,以将其输出为--state标志的值:

systemctl list-units --type=service --all --state=exited,inactive

要检索失败服务单元的列表,请输入list-units带有--failed标志的命令:

systemctl list-units --failed

服务单元配置文件

每个单元都有一个对应的单元文件。这些服务单元配置文件文件通常位于以下目录中:

  • /lib/systemd/system目录包含系统提供的单元文件或已安装的软件包提供的单元文件。
  • /etc/systemd/system目录存储用户提供的服务单元配置文件文件。

列出已安装的服务单元配置文件

在任何给定时间,并非所有服务单元配置文件文件都在系统上处于活动状态。要查看systemd系统上安装的所有服务单元文件,请使用list-unit-files带有可选--type标志的命令:

systemctl list-unit-files --type=service

生成的列表有两列,UNIT FILESTATE

UNIT FILE                              STATE
accounts-daemon.service                enabled
acpid.service                          disabled
apparmor.service                       enabled
apport-forward@.service                static
apt-daily-upgrade.service              static
apt-daily.service                      static
...

单元的状​​态可以启用,禁用,静态,屏蔽或生成。处于静态状态的单元文件不包含“ _安装”_部分,或者是要运行一次,或者它们是另一个单元文件的依赖项,因此不应单独运行。

查看服务单元配置文件文件

要查看单元文件的内容,请运行以下cat命令:

systemctl cat cron

# /lib/systemd/system/cron.service [Unit] Description=Regular background program processing daemon Documentation=man:cron(8) [Service] EnvironmentFile=-/etc/default/cron ExecStart=/usr/sbin/cron -f $EXTRA_OPTS IgnoreSIGPIPE=false KillMode=process [Install] WantedBy=multi-user.target

如果对单元文件的最新更改尚未加载到systemd中,则systemctl cat命令的输出可能是该服务的较旧版本。

要获取服务单元配置文件文件的低级视图,使用以下show命令:

systemctl show cron

这将为服务单元配置文件文件中定义的所有非空属性生成一个属性键=值对的列表:

Type=simple
Restart=no
NotifyAccess=none
RestartUSec=100ms
TimeoutStartUSec=1min 30s
TimeoutStopUSec=1min 30s
RuntimeMaxUSec=infinity
...

要显示空的属性值,请提供--all标志。

要按属性过滤键值对,请使用-p标志:

systemctl show cron -p Names

请注意,属性名称必须大写。

查看服务单元配置文件文件的依存关系

要显示服务单元配置文件文件的依赖关系列表,请使用以下list-dependencies命令:

systemctl list-dependencies cron

生成的输出将显示一个单元依赖关系树,该单元依赖关系必须在有关服务运行之前运行。

cron.service
● ├─system.slice
● └─sysinit.target
●   ├─apparmor.service
●   ├─blk-availability.service
●   ├─dev-hugepages.mount
●   ├─dev-mqueue.mount
●   ├─friendly-recovery.service
...

递归依赖性仅列出.target文件。要列出所有递归依赖项,请传递该--all标志。

要检查哪些服务单元配置文件文件依赖于服务服务单元配置文件文件,可以运行list-dependencies带有--reverse标志的命令:

systemctl list-dependencies cron --reverse

编辑服务单元配置文件文件

使用两种方法可以编辑服务单元配置文件文件systemctl

  1. edit命令在系统的默认文本编辑器中打开一个空白的摘录片段文件:

    sudo systemctl edit ssh

    当文件被保存,systemctl会创建一个名为文件override.conf的目录下时/etc/systemd/system/yourservice.service.d,这里yourservice是您选择要编辑服务的名称。此命令对于更改服务单元配置文件文件的一些属性很有用。

  2. 第二种方法是将edit命令与--full标志一起使用:

    sudo systemctl edit ssh –full

    此命令将打开您选择在文本编辑器中编辑的任何服务单元配置文件文件的完整副本。保存文件后,systemctl将在创建文件/etc/systemd/system/yourservice.service。如果您需要对现有服务单元配置文件文件进行许多更改,这将很有用。

通常,中的任何服务单元配置文件文件/etc/systemd/system都会覆盖中的相应文件/lib/systemd/system

创建服务单元配置文件文件

systemctl如果你试图打开一个不存在的服务单元配置文件文件将抛出一个错误,您可以强制systemctl使用,以创建一个新的单元文件--force的标志:

sudo systemctl edit yourservice.service --force

保存文件后,systemctloverride.conf/etc/systemd/system/yourservice.service.d目录中创建一个文件,其中“ yourservice”是您选择创建的服务的名称。要创建完整的服务单元配置文件文件而不是仅片段,请--force与串联使用--full

sudo systemctl edit yourservice.service --force --full

屏蔽服务单元配置文件文件

要阻止服务手动或自动启动,请使用mask命令将服务符号链接到/dev/null

sudo systemctl mask mysql

与禁用服务类似,该mask命令不会阻止服务继续运行。要屏蔽服务并同时停止服务,请使用--now开关:

sudo systemctl mask mysql --now

要取消屏蔽服务,请使用以下unmask命令:

sudo systemctl unmask mysql

删除服务单元配置文件文件

要删除使用该edit命令创建的单元文件摘要,请删除目录yourservice.service.d(其中“ yourservice”是您要删除的服务)以及override.conf目录中的文件:

sudo rm -r /etc/systemd/system/yourservice.service.d

要删除完整的服务单元配置文件文件,请运行以下命令:

sudo rm /etc/systemd/system/yourservice.service

使用以下命令后,请重新加载systemd守护程序,使其不再尝试引用已删除的服务:

sudo systemctl daemon-reload
Linux中的15个实用Grep命令示例
linux watch命令