systemd是现代Linux系统中广泛使用的初始化系统和服务管理器,负责启动和管理系统进程、服务、系统资源等。支持并行启动进程、依赖关系管理、自动重启服务、日志记录等功能。
1、Systemd基本概念
- Unit:systemd管理的基本单元,每个unit可以表示一个服务、挂载点、设备、套接字等
- Unit文件:单位的配置文件,通常存放在/etc/systemd/system或/lib/systemd/system/目录,文件名通常以.service、.socket、.target等扩展名结尾。systemd会根据这些配置文件来启动和管理服务
- Target:表示一个目标状态,可以是单用户模式、多用户模式,通常以.target文件形式存在。
systemd是Linux系统初始化进程并管理所有进程的父进程,但是只有通过systemd启动的服务进程才会受到Unit管理单元的管理。通过systemctl启动的服务和进程受systemd监控,而手动启动的进程则不在其管理范围内。所以,systemd下的直系子进程可分为两类:受systemd管理的子进程和不受systemd管理的子进程。
例如用户可以通过下面两种方式启动Nginx服务进程
nginx
systemctl start nginx
但是systemd只能监控管理下面第二种方式启动的nginx服务,第一种方式启动的nginx不能使用systemctl stop nginx来停止
2、systemd常见的服务管理命令
启动服务
sudo systemctl start <service_name>
停止服务
sudo systemctl stop <service_name>
重启服务
#重启服务有多种
#服务已运行重启,未运行则启动
sudo systemctl restart <service_name>
#服务已运行则重启,未运行则不启动
sudo systemctl try-restart <service_name>
#服务已运行时,如果支持reload,则reload,如果不支持则restart
#服务未运行时,启动
sudo systemctl reload-or-restart <service_nmae>
#服务已运行时,如果支持reload,则reload,如果不支持则restart
#服务未运行时,不启动
sudo systemctl reload-or-try-restart <service_name>
重载服务:服务运行时重新加载服务,服务未运行时不做任何事
sudo systemctl reload <service_name>
查看服务状态:
#显示服务的当前状态,包括是否正在运行、最近的日志信息等
sudo systemctl status <service_name>
检查服务是否运行状态
#命令用于检查指定服务的当前活动状态。
sudo systemctl is-active <Service_name>
返回值通常有几种:
1、active:服务正在运行并且处于活动状态,且命令退出码为0
2、inactive:服务为运行或者已被停止.且命令退出码非0
3、failed:服务已启动,但启动过程中发生了错误,服务进入失败状态且命令退出码非0
4、unknown:服务状态无法确定,通常是因为服务名称错误或服务没有配置在systemd中且命令退出码非0
如何使用退出码:
可以通过echo $?来查看命令的退出状态码。例如:
sudo systemctl is-active nginx echo $? #输出退出状态码,0表示服务active,非0表示非active #如果nginx正在运行,echo $?输出0 #如果nginx未运行,echo $?输出3(表示inactive)
检查服务是否处于失败状态
sudo systemctl is-failed <service_name>
#返回值为0:服务处于failed状态,即服务启动时出现了错误,导致无法正常运行
#返回值非0:服务没有处于failed状态,可能时active、inactive或其他状态,这种状态命令会输出inactive或active,并退出状态码是非0。
静默模式
sudo systemctl --quiet is-active <service_name>
#该命令用于检查指定的服务是否处于活动状态,并且不会输出任何内容,只会通过退出状态码来表示结果。
#命令退出状态码为0即服务处于active状态。
#命令退出状态码3或其他非0状态码处于inactive(未活动)或failed(失败)等其他状态。
列出所有服务:
#列出所有服务的当前状态(活动、失败等)
sudo systemctl list-units --type=sservice
#列出所有已启用的服务
sudo systemctl list-unit-files --type=service
启用服务(开机自启动):
#设置服务为开机启动
sudo systemctl enable <service_name>
禁用服务(禁止开机启动)
sudo systemctl disable <service_name>
3、查看到服务的状态信息。
sudo systemctl status <service_name>
bash
● <service_name>.service - <Service Description>
Loaded: loaded (/etc/systemd/system/<service_name>.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2025-02-05 09:00:00 UTC; 1h 15min ago
Docs: man:<service_name>(8)
Main PID: 1234 (process_name)
Tasks: 2 (limit: 4915)
Memory: 10.0M
CGroup: /system.slice/<service_name>.service
└─1234 /usr/bin/<service_name>
对于服务来说,重点关注Active行相关的信息,Active状态信息中包含两项内容
如上面的 active(running),它们也分别对应sysetmctl list-units 输出结果中的ACTIVE和SUB状态信息。
Active(状态):描述了服务的整体状态,即服务是否处于活动或运行状态
Sub(子状态):提供了更具体的信息,描述了服务在细节上的运行情况。他可能是running、exited、start或者是其他状态,告诉我们服务是否正常工作。
这两项信息可以对等地理解为: 小老鼠是否在盒子中(盒子中小老鼠是否还存活)。
ACTIVE: active 和 SUB: running:服务正在运行并且正常工作。
ACTIVE: inactive 和 SUB: dead:服务已经停止,类似盒子里没有小老鼠。
ACTIVE: active 和 SUB: start:服务正在启动中,还没完全启动,类似盒子里有小老鼠,但它还在准备活动。
第一项状态信息描述systemd是否在监控服务进程,可能的状态值有:
active:如果一个服务已经启动成功,它将成功加入到systemd监控队列(job queue),此后将受到systemd监控和管理,此时该服务的状态为active
failed:如果一个服务在启动过程中失败,进程崩溃、服务启动过程耗时过久导致超时,该服务的状态将处于failed状态。
inactive:当一个服务未启动,或者服务已停止时,该服务的状态处于inactive状态。
activating、deactivating、reloading:有些服务启动、停止可能会消耗一点时间,在启动或停止的过过程中去查看服务状态,看到的状态
第二项状态信息描述被监控进程的进程状态,虽然有很多种状态,但用户通常只需关注其中几项常见的即可。并且这些状态的存在通常都依赖于第一项状态。
running:表明被systemd监控的服务进程正在运行
dead:表明被systemd监控的进程已经结束,在识别到这种状态后就会将其从监控队列释放不在监控,所以第一项的状态也会随之变为inactive。表示服务完全停止,systemd 不再监控该服务。
有几种情况可以让服务进入dead状态:
1、手动kill服务进程
2、systemctl stop <service_name>
3、systemctl kill <service_name>
4、服务进程执行完任务退出。例如一次性的任务进程(例如批处理任务)
它们执行完任务后会自然退出。在这种情况下,服务进程会结束,systemd 会将其状态更改为 dead,这时服务处于 inactive 状态。
exited:表示服务正常退出,通常会伴随状态码 0/SUCCESS,但服务仍然保持被 systemd 监控的状态。
active(exited):这种状态就表明服务进程已经消失,但服务进程仍然被systemd监控。
auto-restart:表明服务正在被systemd自动重启,当服务配置文件设置了Restart且符合Reastart规则时systemd会自动重启服务