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-active
,is-enabled
和is-failed
监视服务状态:
systemctl is-enabled mysql
要查看systemd
系统上当前正在激活的服务单元,使用以下list-units
命令并按服务类型进行过滤:
systemctl list-units --type=service
注意
list-units
是systemctl
命令的默认操作,因此您只需输入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 FILE和STATE:
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
。
-
该
edit
命令在系统的默认文本编辑器中打开一个空白的摘录片段文件:sudo systemctl edit ssh
当文件被保存,
systemctl
会创建一个名为文件override.conf
的目录下时/etc/systemd/system/yourservice.service.d
,这里yourservice
是您选择要编辑服务的名称。此命令对于更改服务单元配置文件文件的一些属性很有用。 -
第二种方法是将
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
保存文件后,systemctl
将override.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