systemd, systemctl basic, command
Systemd 是 Linux 系统中最新的初始化系统 (init),它主要的设计目标是克服 sysvinit 固有的缺点,提高系统的启动速度
–now
1
2
| # enable and start service0
systemctl --now enable service0
|
Systemd 新特性
- 系统引导时实现服务并行启动
- 按需启动守护进程
- 自动化的服务依赖关系管理
- 同时采用socket式与D-Bus总线式激活服务
- 系统状态快照
查看配置文件位置
1
| systemctl status service0
|
配置文件主要放在 /usr/lib/systemd/system 目录, 也可能在/etc/systemd/system 目录
- /lib/systemd/system:系统默认的单元文件
- /etc/systemd/system:用户安装的软件的单元文件
- /usr/lib/systemd/system:用户自己定义的单元文件
systemd-analyze
查看启动耗时
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| systemd-analyze
# 查看每个服务的启动耗时
systemd-analyze blame
# 显示瀑布状的启动过程流
# 打印严重消耗时间的服务树状表,按照启动消耗的时间进行排序,时间消耗越多,越排到前面。
@之后是服务激活或者启动的时间,
+号之后是服务启动消耗的时间。
个人理解 @ 是从系统引导到服务启动起来的时间,是一个相对时间消耗,+是服务启动消耗的时间,是一个绝对时间消耗。
systemd-analyze critical-chain
# 显示指定服务的启动流 比如 docker.service
systemd-analyze critical-chain docker.service
|
systemd 版本/version
1
2
3
4
| systemctl --version
# 生成一张启动详细信息矢量图, .svg可以用chrome打开
sudo systemd-analyze plot > /home/wiloon/tmp/boot3.svg
|
timedatectl
1
2
3
4
5
6
7
8
9
10
11
| # 查看当前时区设置
$ timedatectl
# 显示所有可用的时区
$ timedatectl list-timezones
# 设置当前时区
$ sudo timedatectl set-timezone America/New_York
$ sudo timedatectl set-time YYYY-MM-DD
$ sudo timedatectl set-time HH:MM:SS
## timedatectl ntp
timedatectl set-ntp true
|
loginctl
1
2
3
4
5
6
7
8
9
10
11
| # 列出当前session
loginctl list-sessions
# 列出当前登录用户
loginctl list-users
# 列出显示指定用户的信息
loginctl show-user wiloon
## 查看 session 类型, 是 X server 还是 wayland, x or wayland
loginctl show-session <SESSION_ID> -p Type
|
cat
1
| systemctl cat bluetooth|grep Condition
|
mask
1
2
| systemctl mask service0
systemctl unmask service0
|
1
2
| systemd-analyze blame
systemctl list-timers --all
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
| # 查看是否启用
systemctl is-enabled service0
# to see which units have failed.
systemctl --failed
# 退出系统并关闭电源
systemctl poweroff
systemctl reboot
# CPU 停止工作
$ sudo systemctl halt
# 待机
systemctl suspend
systemctl hibernate
# 混合休眠模式 (同时休眠到硬盘并待机) :
systemctl hybrid-sleep
# list all service
systemctl
systemctl list-unit-files | grep enabled
# 查看所有单元
$ systemctl list-unit-files
# 查看所有 Service 单元
$ systemctl list-unit-files --type service
# 查看所有 Timer 单元
$ systemctl list-unit-files --type timer
显示所有已启动的服务
systemctl list-units --type=service
systemctl is-active httpd.service (仅显示是否 Active)
systemctl daemon-reload
# check service enabled
systemctl list-unit-files |grep enabled
# 查看服务是否开机启动
systemctl is-enabled foo.service
# 禁止 foo.service 开机启动
systemctl disable foo.service
# 禁止 foo.service 开机启动, 同时停掉服务
systemctl --now disable foo.service
journalctl -f
systemd-analyze blame
systemctl --type=service
systemctl status xxx
|
systemctl status
1
2
3
4
5
6
| Loaded行: 配置文件的位置,是否设为开机启动
Active行: 表示正在运行
Main PID行: 主进程ID
Status行: 由应用本身 (这里是 httpd ) 提供的软件当前状态
CGroup块: 应用的所有子进程
日志块: 应用的日志
|
1
2
| # 打印完整的控制台日志, 不加 -l 的话, 默认会截断.
systemctl status service0 -l
|
http://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-commands.html
Unit
Systemd 可以管理所有系统资源。不同的资源统称为 Unit (单位) 。
Unit 一共分成12种。
1
2
3
4
5
6
7
8
9
10
11
12
| Service unit: 系统服务
Target unit: 多个 Unit 构成的一个组
Device Unit: 硬件设备
Mount Unit: 文件系统的挂载点
Automount Unit: 自动挂载点
Path Unit: 文件或路径
Scope Unit: 不是由 Systemd 启动的外部进程
Slice Unit: 进程组
Snapshot Unit: Systemd 快照,可以切回某个快照
Socket Unit: 进程间通信的 socket
Swap Unit: swap 文件
Timer Unit: 定时器
|
systemctl list-units
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| # 列出正在运行的 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 管理
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
| # 立即启动一个服务
$ sudo systemctl start apache.service
# 立即停止一个服务
$ sudo systemctl stop apache.service
# 重启一个服务
$ sudo systemctl restart apache.service
# 杀死一个服务的所有子进程
$ sudo systemctl kill apache.service
# 重新加载一个服务的配置文件
$ sudo systemctl reload apache.service
# 重载所有修改过的配置文件
$ sudo systemctl daemon-reload
# 显示某个 Unit 的所有底层参数
$ systemctl show httpd.service
# 显示某个 Unit 的指定属性的值
$ systemctl show -p CPUShares httpd.service
# 设置某个 Unit 的指定属性
$ sudo systemctl set-property httpd.service CPUShares=500
|
依赖关系
1
2
| systemctl list-dependencies nginx.service
systemctl list-dependencies --all nginx.service
|
/etc/systemd/system/
/usr/lib/systemd/system/
/etc/systemd/system/multi-user.target.wants/v2ray.service
systemctl mask和systemctl disable
systemctl mask和systemctl disable的区别一般很难注意到,因为我大部分时候只会使用systemctl disable,并不会用到systemctl mask。在一次遇到问题的时候,需要使用systemctl mask来禁用服务,下边具体说明。
systemctl enable的作用
我们知道,在系统中安装了某个服务以后,需要将该服务设置为开机自启,那么一般会执行systemctl enable xxx,这个时候会发现shell中会输出两行提示,一般类似如下:
[root@NameNode01 system]# systemctl enable NetworkManager
Created symlink from /etc/systemd/system/multi-user.target.wants/NetworkManager.service to /usr/lib/systemd/system/NetworkManager.service.
Created symlink from /etc/systemd/system/dbus-org.freedesktop.nm-dispatcher.service to /usr/lib/systemd/system/NetworkManager-dispatcher.service.
Created symlink from /etc/systemd/system/network-online.target.wants/NetworkManager-wait-online.service to /usr/lib/systemd/system/NetworkManager-wait-online.service.
这个命令会在/etc/systemd/system/目录下创建需要的符号链接,表示服务需要进行启动。通过 stdout 输出的信息可以看到,软连接实际指向的文件为/usr/lib/systemd/system/目录中的文件,实际起作用的也是这个目录中的文件。
systemctl disable xxx的作用
执行systemctl disable xxx后,会禁用这个服务。它实现的方法是将服务对应的软连接从/etc/systemd/system中删除。命令执行情况一般类似如下:
[root@NameNode01 system]# systemctl disable NetworkManager
Removed symlink /etc/systemd/system/multi-user.target.wants/NetworkManager.service.
Removed symlink /etc/systemd/system/dbus-org.freedesktop.NetworkManager.service.
Removed symlink /etc/systemd/system/dbus-org.freedesktop.nm-dispatcher.service.
Removed symlink /etc/systemd/system/network-online.target.wants/NetworkManager-wait-online.service.
在执行systemctl disable xxx的时候,实际只是删除了软连接,并不会产生其他影响。
systemctl mask xxx的作用
执行 systemctl mask xxx会屏蔽这个服务。它和systemctl disable xxx的区别在于,前者只是删除了符号链接,后者会建立一个指向/dev/null的符号链接,这样,即使有其他服务要启动被mask的服务,仍然无法执行成功。执行该命令的效果一般类似如下:
[root@NameNode01 system]# systemctl mask NetworkManager
Created symlink from /etc/systemd/system/NetworkManager.service to /dev/null.
systemctl mask xxx和systemctl disable xxx的区别
在执行过mask后,如果想要启动服务,那么会报类似如下错误:
[root@NameNode01 system]# systemctl start NetworkManager
Failed to start NetworkManager.service: Unit is masked.
如果使用disable的话,可以正常启动服务。总体来看,disable和enable是一对操作,是用来启动、停止服务。
使用systemctl unmask xxx取消屏蔽
如果使用了mask,要想重新启动服务,必须先执行unmask将服务取消屏蔽。mask和unmask是一对操作,用来屏蔽和取消屏蔽服务。
————————————————
版权声明:本文为CSDN博主「stpice」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/stpice/article/details/104569146
https://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-part-two.html
https://www.cnblogs.com/xingmuxin/p/11413784.html
https://blog.csdn.net/stpice/article/details/104569146
systemd 配置文件
- 系统配置文件: /etc/systemd/system.conf
- 用户配置文件: /etc/systemd/user.conf
systemd 用户实例不会继承类似 .bashrc 中定义的环境变量。systemd 用户实例有三种设置环境变量的方式:
对于有 $HOME 目录的用户,可以在 ~/.config/systemd/user.conf 文件中使用 DefaultEnvironment 选项,这些设置只对当前用户的用户单元有效。
在 /etc/systemd/user.conf 文件中使用 DefaultEnvironment 选项。这个配置在所有的用户单元中可见。
在 /etc/systemd/system/user@.service.d/ 下增加配置文件设置。 这个配置在所有的用户单元中可见。
在任何时候, 使用 systemctl –user set-environment 或 systemctl –user import-environment. 对设置之后启动的所有用户单元有效,但已经启动的用户单元不会生效。
提示: 如果想一次设置多个环境变量,可以写一个配置文件,文件里面每一行定义一个环境变量,用 “key=value” 的键值对表示,然后在你的启动脚本里添加xargs systemctl –user set-environment < /path/to/file.conf。
————————————————
版权声明:本文为CSDN博主「Golden_Chen」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Golden_Chen/article/details/114689804
systemd资源控制
https://www.cnblogs.com/jimbo17/p/9107052.html
https://documentation.suse.com/zh-cn/sles/15-SP2/html/SLES-all/cha-tuning-cgroups.html
1
| systemctl set-property user.slice MemoryAccounting=yes
|