作为Linux运维和开发者,你一定听过systemd这个词——它是Linux系统的大管家,掌控着系统启动、服务管理、日志监控等核心操作。systemd 是 Linux 操作系统的系统和服务管理器,简单说,它是系统启动后第一个运行的进程,由内核直接启动,接管后续所有系统服务的启动、维护和停止,相当于Linux系统的总管家。在systemd出现之前,Linux主要用 SysV init(简称sysv)管理服务,它通过串行执行脚本启动服务,效率低、依赖管理混乱,启动慢且容易出问题。而systemd的诞生,就是为了解决这些痛点,它的核心优势的是: - 精准管理服务依赖,避免“服务没启动就调用”的问题;
如今,几乎所有主流Linux发行版都默认使用systemd。二、核心概念:systemd的管理单元——Unit在systemd的世界里,一切可管理的资源都叫单元(Unit),比如服务、定时任务、挂载点、网络套接字等,每种单元都有对应的配置文件,用于定义其运行规则。不同类型的Unit,用后缀名区分,日常工作中接触最多的是这5种:Unit文件主要存放在两个目录,优先级不同,记住这个规则能避免修改被覆盖:/lib/systemd/system/:系统预装的Unit文件,不建议直接修改,软件更新会覆盖你的修改;/etc/systemd/system/:管理员自定义的Unit文件,优先级更高,修改或新增服务时,优先在这里操作。提示:如果需要修改系统预装的Unit文件,建议复制到/etc/systemd/system/目录后再修改,或用systemctl edit命令创建覆盖文件。systemctl 是与systemd交互的核心命令,所有Unit的管理操作都通过它完成,以下是日常最常用的命令。以Nginx服务(nginx.service)为例:# 启动服务sudo systemctl start nginx# 停止服务sudo systemctl stop nginx# 重启服务(服务异常时常用)sudo systemctl restart nginx# 重新加载配置(不中断服务,推荐用于配置修改后)sudo systemctl reload nginx
注意:不是所有服务都支持reload,如果不确定,用restart替代即可。服务启动后,重启系统就失效了,原因是没设置开机自启。用这两个命令搞定:# 设置开机自启sudo systemctl enable nginx# 取消开机自启sudo systemctl disable nginx# 查看是否已设置开机自启(返回enabled/disabled)systemctl is-enabled nginx
查看服务状态是排查故障的核心操作,能获取服务是否运行、PID、日志等关键信息:# 查看单个服务详细状态(最常用)systemctl status nginx# 查看所有服务状态(输出较多,慎用)systemctl list-units --type=service# 只查看活跃的服务systemctl list-units --type=service --state=active# 查看所有启动失败的服务(快速定位故障)systemctl --failed
- Loaded:服务是否已加载,以及是否开机自启(enabled=开机自启,disabled=否);
- Active:服务当前状态(running=运行中,exited=已退出,failed=启动失败);
- Main PID:服务主进程ID,可用于杀死异常进程(kill PID)。
systemd日志管理工具journalctl,能快速查看服务日志,定位启动失败原因:# 查看指定服务的所有日志journalctl -u nginx# 查看指定服务的实时日志(类似tail -f)journalctl -u nginx -f# 查看最近10行日志(精简输出)journalctl -u nginx -n 10# 按时间筛选日志(例如:查看今天的日志)journalctl -u nginx --since today
这里如果服务启动失败,直接用journalctl -u 服务名,通常能找到失败原因,比如配置文件错误、端口被占用。systemd用target替代了sysv的运行级别,常用的目标单元对应如下,可根据需求切换:# 临时切换到文本界面(重启后失效)sudo systemctl isolate multi-user.target# 设置默认启动为文本界面(重启后生效)sudo ln -sf /lib/systemd/system/multi-user.target /etc/systemd/system/default.target
日常工作中,我们经常需要将自己写的脚本做成系统服务,实现后台运行、开机自启、故障自动重启,这就需要自定义.service文件。下面以Python Web应用为例,一步步教你编写自定义服务。一个完整的.service文件,包含3个核心区块,语法简单,按模板修改即可:[Unit]# 服务描述(必填,用于日志和命令显示)Description=Python Web Application Service# 服务依赖(可选,指定服务启动前需要启动的服务)After=network.target # 网络启动后再启动本服务# 弱依赖(可选,依赖服务失败不影响本服务)Wants=network.target[Service]# 服务运行用户(建议用非root用户,提高安全性)User=wwwGroup=www# 服务启动类型(重点,默认simple)Type=simple# 启动命令(必填,写脚本/程序的绝对路径)ExecStart=/usr/bin/python3 /opt/webapp/app.py# 停止命令(可选,自定义停止逻辑)ExecStop=/usr/bin/pkill -f app.py# 重启策略(可选,服务失败时自动重启)Restart=on-failure# 重启间隔(可选,失败后等待3秒再重启)RestartSec=3[Install]# 服务安装目标(必填,指定开机自启时关联的target)WantedBy=multi-user.target
Type(启动类型):默认simple,根据脚本类型选择:Restart(重启策略):按需设置,推荐on-failure,避免服务意外挂掉。User/Group:尽量不用root用户,创建专用用户运行服务,降低安全风险。# 1. 编写.service文件(文件名建议和服务名一致,如webapp.service)sudo vim /etc/systemd/system/webapp.service# 粘贴上面的模板,修改ExecStart、User等参数# 2. 重载systemd配置(新增/修改服务后必须执行)sudo systemctl daemon-reload# 3. 启动服务并查看状态sudo systemctl start webappsystemctl status webapp# 4. 设置开机自启sudo systemctl enable webapp
如果启动失败,用journalctl -u webapp查看日志,排查ExecStart路径是否正确、用户权限是否足够等问题。- 服务启动失败,提示“Loaded: error (Reason: No such file or directory)”?
检查.service文件路径是否正确,或文件名是否写错,确保在/etc/systemd/system/目录下。- 执行systemctl reload 提示“Job for xxx.service failed because the control process exited with error code”?
服务不支持reload,改用restart命令,或检查ExecReload配置是否正确。检查[Install]区块的WantedBy是否正确,或执行systemctl is-enabled 服务名,确认是否为enabled状态。确保服务确实启动过,或添加--all参数(journalctl -u 服务名 --all),查看所有日志。systemd 作为现代Linux的核心服务管理器,看似复杂,实则掌握核心逻辑后非常简单:核心是“Unit”,最常用的是.service(服务)和.target(目标);操作靠“systemctl”,记住启动、停止、自启、日志4类核心命令;自定义服务只需编写.service文件,按模板修改即可快速部署。对于Linux运维和开发者来说,掌握systemd是必备技能——它能帮你高效管理服务、快速排查故障,让系统运行更稳定。