systemctl系统服务管理



RHEL6版本及以前,采用的第一个进程都是init.第一个进程非常重要,因为第一个进程要负责后面所有进程的启动,后面其他进程能否启动成功取决于系统能不能正常运行.


通过init进程启动的后续进程都是串行启动的,串行启动就意味着速度慢.


Centos7以后系统默认使用systemctl管理系统服务,采用第一个进程叫做systemd.


该进程相比init来说,采用并行启动后续进程,并行启动意味着速度快.

systemctl系统服务管理_linux

systemctl系统服务管理_图形化界面_02

systemctl的管理单位-unit

systemd管理的内容不仅service,systemd管理的单位是unit,service只是unit的一种.

我们重点关心service和target

systemctl管理service

service服务文件基本格式

服务文件存放在/usr/lib/systemd/system目录

NetworkManager的文件示例

# 查看NetworkManager的service文件
[root@c8 ~]# cat /usr/lib/systemd/system/NetworkManager.service
[Unit]
# 定义的描述
Description=Network Manager
Documentation=man:NetworkManager(8)
# 依赖服务
Wants=network.target
# 在network-pre.targe启动完成后启动--前置条件
After=network-pre.target dbus.service
# 启动后启动的unit--后置条件
Before=network.target network.service

[Service]
# 类型
Type=dbus
BusName=org.freedesktop.NetworkManager
# 需要加载的内容
ExecReload=/usr/bin/busctl call org.freedesktop.NetworkManager /org/freedesktop/NetworkManager org.freedesktop.NetworkManager Reload u 0
#ExecReload=/bin/kill -HUP $MAINPID
# 需要启动的程序
ExecStart=/usr/sbin/NetworkManager --no-daemon
Restart=on-failure
# NM doesn't want systemd to kill its children for it
# 意思是以进程方式关闭
KillMode=process
# 兼容性
CapabilityBoundingSet=CAP_NET_ADMIN CAP_DAC_OVERRIDE CAP_NET_RAW CAP_NET_BIND_SERVICE CAP_SETGID CAP_SETUID CAP_SYS_MODULE CAP_AUDIT_WRITE CAP_KILL CAP_SYS_CHROOT
# 系统保护
ProtectSystem=true
# 保护家目录
ProtectHome=read-only

# We require file descriptors for DHCP etc. When activating many interfaces,
# the default limit of 1024 is easily reached.
LimitNOFILE=65536


[Install]
# 定义service放在哪个target里面
WantedBy=multi-user.target
# 服务的别名
Alias=dubs-org.freedesktop.NetworkManager.service
Also=NetworkManager-dispatcher.service

# We want to enable NetworkManager-wait-online.service whenever this service
# is enabled. NetworkManager-wait-online.service has
# WantedBy=network-online.target, so enabling it only has an effect if
# network-online.target itself is enabled or pulled in by some other unit.
Also=NetworkManager-wait-online.service

自定义service文件

服务文件存放在/usr/lib/systemd/system目录

[Unit]
# 定义的描述
Description=Network Manager
[Service]
# 类型
Type=notify
# 需要启动的程序
ExecStart=/usr/bin/test.sh &
# 服务停止时的命令
ExecStop=killall test.sh
# 需要加载的内容
ExecReload=/bin/kill -HUP $MAINPID
[Install]
# 如果想要执行enable,必须写Install的内容

查看开机启动列表

# systemctl list-unit-files |grep 系统服务名
[root@localhost ~]# systemctl list-unit-files | grep firewalld
firewalld.service disabled

设置开机启动

systemctl在enable、disable、mask子命令里面增加了–now选项,可以激活同时启动服务,激活同时停止服务等。

# 设置开机启动并现在启动
## 相当于同时执行了systemctl start 服务名
systemctl enable --now firewalld

# 查看服务启动状态
root@localhost ~]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
Active: active (running) since 日 2021-09-05 23:12:15 CST; 8s ago
Docs: man:firewalld(1)
Main PID: 31773 (firewalld)
CGroup: /system.slice/firewalld.service
└─31773 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid

905 23:12:14 localhost.localdomain systemd[1]: Starting firewalld - dynamic firewall daemon...
905 23:12:15 localhost.localdomain systemd[1]: Started firewalld - dynamic firewall daemon.

取消开机启动

# 取消开机启动并现在就停止服务
systemctl disable --now firewalld
## 查看服务状态是否停止
[root@localhost ~]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
Active: inactive (dead)
Docs: man:firewalld(1)

905 23:06:15 localhost.localdomain systemd[1]: Starting firewalld - dynamic firewall daemon...
905 23:06:16 localhost.localdomain systemd[1]: Started firewalld - dynamic firewall daemon.
905 23:06:31 localhost.localdomain systemd[1]: Stopping firewalld - dynamic firewall daemon...
905 23:06:33 localhost.localdomain systemd[1]: Stopped firewalld - dynamic firewall daemon.

# 查看启动列表
[root@localhost ~]# systemctl list-unit-files |grep firewalld
firewalld.service disabled

开启服务

systemctl start firewall

关闭服务

systemctl stop firewall

重启服务

systemctl restart 服务名

重新加载配置

systemctl reload 服务名

输出服务运行的状态

systemctl status 服务名

检查service是否在启动状态

写脚本是判断服务器是否启动很管用

# systemctl is-active 服务名
systemctl is-active NetworkManager
# active

检测unit单元是否为自动启动

写脚本时判断服务器是否开机自启很管用

# systemctl is-enabled 服务名
systemctl is-enabled firewalld
# enabled

注销一个服务(service)

systemctl mask 是注销服务的意思。
注销服务意味着:
该服务在系统重启的时候不会启动
该服务无法进行做systemctl start/stop操作
该服务无法进行systemctl enable/disable操作

systemctl mask firewalld

取消注销服务(service)

systemctl unmask firewalld

显示单元的手册页(前提是由unit提供)

systemctl help

重新载入整个systemd的系统配置并扫描unit文件的变动

systemctl daemon-reload

systemctl管理target

target是一个box(盒子),装了很多service(服务),可以理解为一组service(服务).

tartget是由服务组成的一类启动目标,systemd可以设置启动目标.

如果systemd指定了一个target作为启动目标,那么下次启动的时候就会启动target里面的所有服务.

multi-user.target–文本界面的Linux系统

tty0 和 tty1 默认是图形界面,临时切换文本界面后,tty0和tty1变成文本界面了

将图形界面临时切换到文本界面

systemctl isolate multi-user.target
# 需要等待几分钟

graphical.target–图形化界面的Linux系统

将文本界面临时切换到图形化界面

systemctl isolate graphical.target
# 需要等待几分钟

查看下次下次启动时加载的默认target

systemctl get-default 

永久设置下次启动时加载的默认target

# 永久设置图形化界面启动
systemctl set-default graphical.target
# 永久设置文本界面启动
systemctl set-default multi-user.target