一、服务是什么?
Linux中的服务是一种提供某些功能的、常驻在内存中的进程,称为service服务。而Linux中一切皆文件,因此提供服务需要一个文件,而这个文件一般称为daemon。简单说就是一个daemon文件启动,提供某些功能,就称为服务,比如SSH服务、httpd服务、mysqld服务。
二、使用systemd服务
早期通过init进行服务的管理,包括服务的启动、关闭与查看。从CentOS7之后是使用systemd进行服务的管理,因此重点学习systemd即可。
它是Linux下的一种init软件,systemd提供了更快的启动速度和更强大的管理功能,在systemd中,可以通过systemctl命令来管理服务,包括启动、停止、重启、查看状态以及启用和禁用服务等。例如,通过systemctl start命令可以启动一个服务,而systemctl stop命令则可以停止一个服务。
总的来说,systemd为Linux系统提供了一个强大且灵活的系统与服务管理框架,使得系统管理员能够更加方便地管理和维护系统服务。
2.1 服务分类
systemd采用服务单元(Unit)作为管理系统的抽象层,涵盖各类系统资源,如服务(services)、定时任务(timers)、挂载点(mounts)、sockets、设备(devices)、路径(paths)等。每个单元由一个.unit文件(如myservice.service)来描述其属性和行为。
systemd采用服务单位(Unit)来定义一个服务,然后将不同的unit分类为:service、socket、target、path、timer等等。systemd定义了一个target集合,用于归集一个群组。而不同的类型一般是以文件后缀名进行区分。
[root@localhost system]# ll | grep -E '(vsftpd|multi|cron)'
-rw-r--r--. 1 root root 356 11月 9 2019 crond.service
-rw-r--r-- 1 root root 831 7月 28 2021 multipathd.service
-rw-r--r-- 1 root root 186 7月 28 2021 multipathd.socket
-rw-r--r-- 1 root root 532 6月 22 2018 multi-user.target
drwxr-xr-x. 2 root root 258 3月 7 2023 multi-user.target.wants
lrwxrwxrwx 1 root root 17 12月 22 2021 runlevel2.target -> multi-user.target
lrwxrwxrwx 1 root root 17 12月 22 2021 runlevel3.target -> multi-user.target
lrwxrwxrwx 1 root root 17 12月 22 2021 runlevel4.target -> multi-user.target
扩展名 | 主要服务功能 |
---|---|
.sevice | 一般服务类型(service unit),包括服务器本身的本地服务和网络服务,大多数都是这种 |
.socket | 内部程序数据交换的socket服务(socker unit),使用socket类型的服务较少,一般用于本地程序的交互 |
.target | 执行环境类型(target unit),其实就是多个unit的集合,类似于分组是多个服务的集合 |
.mount/.automount | 文件系统挂载相关的服务,如网络挂载,NFS挂载等 |
.timer | 循环执行的服务(timer unit),类似于cron定时任务,这个是由systemd提供,更加灵活 |
2.2 服务涉及的目录
unit脚本的存放目录/usr/lib/systemd/system/
,每个服务最主要的服务脚本,类似于/etc/init.d下的文件。
/etc/systemd/system/
:管理员根据需求建立的执行脚本,可以理解为/usr/lib/systemd/system/
的附加或者映射。官方建议是不修改原始启动文件,而是在/etc/systemd/system/
添加附加设置覆盖原有设置,但是实际操作中还是直接修改原始文件较多。
三、服务的管理
systemd主要是通过systemctl的命令来实现。
命令格式:systemctl [command] [unit]
command选项:
选项 | 功能 |
---|---|
start | 立刻启动后面接的unit |
stop | 立刻关闭后面接的unit |
restart | 立刻重新启动后面接的unit |
reload | 不关闭后面接的unit,重新加载配置文件,让设置生效 |
enable | 设置下次开机时启动,开机自启 |
disable | 设置下次开机时不会启动,关闭开机自启 |
status | 查看后面接的unit的状态,常用 |
is-active | 检查后面的unit有没有运行 |
is-enable | 检查后面接的unit有没有开机启动 |
3.1 使用systemctl查看服务
如果单一服务的查看,直接在后面接服务名称,也就是/usr/lib/systemd/system/
后面的文件名称。
# 以系统服务atd为例。
[root@localhost system]# systemctl status atd
● atd.service - Job spooling tools
Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2023-10-05 11:16:03 CST; 6 months 10 days ago
Main PID: 1191 (atd)
Tasks: 1 (limit: 49140)
Memory: 464.0K
CGroup: /system.slice/atd.service
└─1191 /usr/sbin/atd -f
Warning: Journal has been rotated since unit was started. Log output is incomplete or unavailable.
大致分为两部分:服务信息和进程信息。
服务信息:
-
Loaded:包含unit文件位置,是否开机自启(enabled/disabled)其它状态(static不自启可以被启动/mask不能被启动),预设下一次是否自启 -
Active:运行状态:active(running/exited/waiting),inactive目前停止运行,以及服务运行时间
进程信息:
-
Main PID:进程ID -
Memory:使用的内存
服务的停止与启动:
# 停止服务
systemctl stop nginx.service
# 启动服务
systemctl start nginx.service
# 重启服务
systemctl restart nginx.service
3.2 查看系统的所有服务
如果要查看系统上所有的服务可以通过list-units
以及list-unit-files
查看。
格式为:systemctl [command] [--type=TYPE(|service|socket|target|等)] [--all]
# 列出当前启动的服务
systemctl
UNIT LOAD ACTIVE SUB DESCRIPTION
proc-sys-fs-binfmt_misc.automount loaded active running Arbitrary Executable File Formats File System Automount Point
sys-devices-pci0000:00-0000:00:01.1-ata1-host0-target0:0:1-0:0:1:0-block-sr0.device loaded active plugged QEMU_DVD-ROM
sys-devices-pci0000:00-0000:00:04.0-0000:02:01.0-virtio2-block-vda-vda1.device loaded active plugged /sys/devices/pci0000:00/0000:00:04.0/0000:02:01.0/virtio2/block/vda/vda1
UNIT : 项目的名称
LOAD : 开机是否自启
ACTIVE : 当前的状态
DSCRIPTION : 详细描述
# 列出所有已安装的unit
systemctl list-unit-files
[root@localhost ~]# systemctl list-unit-files
UNIT FILE STATE
proc-sys-fs-binfmt_misc.automount static
-.mount generated
boot.mount generated
dev-hugepages.mount static
dev-mqueue.mount static
home.mount generated
proc-sys-fs-binfmt_misc.mount static
sys-fs-fuse-connections.mount static
sys-kernel-config.mount static
sys-kernel-debug.mount static
tmp.mount disabled
# 根据类型筛选,查询service类型的服务
systemctl list-units --type=service
[root@localhost ~]# systemctl list-units --type=service
UNIT LOAD ACTIVE SUB DESCRIPTION
atd.service loaded active running Job spooling tools
auditd.service loaded active running Security Auditing Service
chronyd.service loaded active running NTP client/server
containerd.service loaded active running containerd container runtime
四、切换操作界面环境
以前我记得好像linux得系统级别也就是纯命令行与图形界面级别这些是通过level进行切换的。然后在systemd中可以通过target
进行切换。
前面unit分类时候有一个target
类别,这个就是跟操作界面有关的项目。
查看target项目:
[root@localhost systemd]# systemctl list-units --type=target --all
UNIT LOAD ACTIVE SUB DESCRIPTION
● all.target not-found inactive dead all.target
basic.target loaded active active Basic System
cryptsetup.target loaded active active Local Encrypted Volumes
emergency.target loaded inactive dead Emergency Mode
getty-pre.target loaded inactive dead Login Prompts (Pre)
getty.target loaded active active Login Prompts
graphical.target loaded inactive dead Graphical Interface
initrd-fs.target loaded inactive dead Initrd File Systems
initrd-root-device.target loaded inactive dead Initrd Root Device
initrd-root-fs.target loaded inactive dead Initrd Root File System
initrd-switch-root.target loaded inactive dead Switch Root
initrd.target loaded inactive dead Initrd Default Target
local-fs-pre.target loaded active active Local File Systems (Pre)
local-fs.target loaded active active Local File Systems
multi-user.target loaded active active Multi-User System
# 系统已经预设了多种项目,我们只需要简单了解常用的即可
target项目 | 说明 |
---|---|
graphical.target | 命令行+图形界面,默认已经包含multi-user.target |
multi-user.target | 纯命令行模式 |
rescue.target | 维护模式 |
emergency.target | 紧急模式 |
shutdown.target | 关机的模式 |
模式的切换:
systemctl [command] [unit.target]
command:
-
get-default,获取当前的target -
set-default,设置默认的target -
isolate,切换模式
# 查看当前模式
[root@localhost systemd]# systemctl get-default
multi-user.target
# 切换为图形界面
[root@localhost systemd]# systemctl isolate graphical.target
五、service类型服务的配置文件说明
前面大致了解了unit的分类、查看unit的状态,现在来具体查看daemon脚本的内容。
下面以sshd.service为示例:
[root@localhost system]# cat sshd.service
[Unit]
Description=OpenSSH server daemon
Documentation=man:sshd(8) man:sshd_config(5)
After=network.target sshd-keygen.target
Wants=sshd-keygen.target
[Service]
Type=notify
EnvironmentFile=-/etc/crypto-policies/back-ends/opensshserver.config
EnvironmentFile=-/etc/sysconfig/sshd
ExecStart=/usr/sbin/sshd -D $OPTIONS $CRYPTO_POLICY
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartSec=42s
[Install]
WantedBy=multi-user.target
整体分为3个部分:Unit、Service、Install。
-
Unit项目本身的描述说明、其它依赖daemon以及启动什么服务再启动设置 -
Service、Socket、Timer、Path,对应不同类型的Unit,不同的unit这里写不同的名称,主要包括服务启动的脚本、环境配置文件、重新启动的方式等。 -
Istall表示将该unit安装到哪个target下。
下面安装三个部分具体分析:
[Unit]部分:
-
Description:服务的说明描述 -
Documentation:相关文档,可以是Documentation=http:xxxx或者Documentation=man sshd等 -
After:说明此服务在哪个服务启动之后才启动,没有强制要求 -
Before:说明此服务在哪个服务启动之前启动,没有强制要求 -
Requires:明确定义此unit在哪个daemon启动之后才能启动,设置依赖服务 -
Wants:与Requires相反,没有强制要求 -
Conflicts:代表冲突的服务,后面接的服务如果启动了则该服务本身不能启动
[Service]部分:
-
Type,说明daemon的启动方式包括:simple默认值,forking父子进程类型,oneshot执行单次关闭,还有notify通知以及其它 -
EnvironmentFile:指定启动脚本的环境配置文件,可以接多个以及设置变量 -
ExecStart:实际脚本命令的启动,一般是脚本+选项+配置文件路径 -
ExecStop:类似于systemctl stop -
ExecReload:类似于载配置systemctl reload -
Restart:重启操作,可以配置其它参数设置定时重启? -
KillMode:有几种方式process结束主进程,control-group由此产生的其它进程也会关闭,none没有进程被关闭
[Install]部分:
-
WantedBy:表示unit安装在哪个操作界面环境中,大多数情况下是multi-user.target中 -
Also:当目前unit本身是开机启动,Also后面接的unit也开机启动,设置关联依赖性启动 -
Alias:运行一个链接的别名
相关的目录:
-
/usr/lib/systemd/system/
:官方默认启动脚本文件路径 -
/run/systemd/system/
:系统执行过程所产生的服务脚本 -
/etc/systemd/system/
:管理员手动增加的配置,映射目录 -
/etc/sysconfig/*
:大部分服务都会将初始化选项设置写入该目录 -
/var/lib/
:产生数据的服务保存的目录,如mysql数据库 -
/run/
:daemon的缓存,包括lock和pid文件等
官方建议使用修改配置过程: 原有目录/usr/liv/systemd/system/sshd.service
不修改,在/etc/systemd/system/sshd.service.d/custom.conf
下创建同名的目录,添加.d后缀,然后在下面的目录编写.conf文件,这些文件配置会累加到默认文件中。
本文由 mdnice 多平台发布