systemctl系统服务管理
- service服务文件基本格式
- 查看开机启动列表
- 设置开机启动
- 取消开机启动
- 开启服务
- 关闭服务
- 重启服务
- 重新加载配置
- 输出服务运行的状态
- 检查service是否在启动状态
- 检测unit单元是否为自动启动
- 注销一个服务(service)
- 取消注销服务(service)
- 显示单元的手册页(前提是由unit提供)
- 重新载入整个systemd的系统配置并扫描unit文件的变动
RHEL6版本及以前,采用的第一个进程都是init.第一个进程非常重要,因为第一个进程要负责后面所有进程的启动,后面其他进程能否启动成功取决于系统能不能正常运行.
通过init进程启动的后续进程都是串行启动的,串行启动就意味着速度慢.
Centos7以后系统默认使用systemctl管理系统服务,采用第一个进程叫做systemd.
该进程相比init来说,采用并行启动后续进程,并行启动意味着速度快.
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
9月 05 23:12:14 localhost.localdomain systemd[1]: Starting firewalld - dynamic firewall daemon...
9月 05 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)
9月 05 23:06:15 localhost.localdomain systemd[1]: Starting firewalld - dynamic firewall daemon...
9月 05 23:06:16 localhost.localdomain systemd[1]: Started firewalld - dynamic firewall daemon.
9月 05 23:06:31 localhost.localdomain systemd[1]: Stopping firewalld - dynamic firewall daemon...
9月 05 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