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
5sudo 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
,一般有两种方法:
- 在
/etc/systemd/system
目录下创建nginx.service
文件,里面写上我们自己的配置。 - 在
/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服务,您需要遵循以下步骤:
使用文本编辑器在创建一个新的Service文件,例如
my_service.service
。1
sudo vim /lib/systemd/system/my_service.service
在打开的文件中,添加以下内容:
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
字段修改为您要执行的命令的路径。保存并关闭文件。
使用systemctl管理Service
一旦创建了Service文件,您可以使用systemctl命令来管理和控制您的服务。
重新加载systemd配置。
执行以下命令,重新加载systemd配置,以使新创建的Service生效:
1
sudo systemctl daemon-reload
启动Service。
执行以下命令,启动您创建的Service:
1
sudo systemctl start my_service
停止Service。
要停止正在运行的Service,可以使用以下命令:
1
sudo systemctl stop my_service
重启Service。
如果需要重启Service,可以使用以下命令:
1
sudo systemctl restart my_service
查询Service状态。
要获取Service的当前状态,可以使用以下命令:
1
sudo systemctl status my_service
设置开机自启。
如果希望Service在系统启动时自动启动,执行以下命令:
1
sudo systemctl enable my_service
这样,您的Service将在系统启动时自动启动
取消开机启动
1
sudo systemctl disable my_service
重新加载服务
必须在服务启动的情况下,重新加载服务,不然报错,它并不支持所有的服务,比如 network
1
sudo systemctl reload my_service
查看服务是否设置成开机启动
看输出结果,就知道是否是开机启动,enabled 代表开机启动,disabled 代表开机不启动
1
sudo systemctl is-enabled my_service
注销指定服务
注销服务后,服务就没法启用了,这对于禁用高危服务相当有用
1
sudo systemctl mask my_service
取消注销指定服务
重新启用注销的服务
1
sudo systemctl unmask my_service
列出所有可用单元
1
sudo systemctl list-unit-files
列出所有已启动的服务列表信息
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服务相关日志 |