在CentOS系统中,管理系统服务是保障应用稳定运行和实现自动化运维的关键环节,现代CentOS版本(如7、8、9及Stream)普遍采用systemd作为其初始化系统和服务管理器,它取代了传统的SysVinit,提供了更强大的并行启动能力、依赖关系管理和按需激活功能,理解并熟练使用systemd来设置系统服务,是每一位系统管理员的必备技能。

systemd与Unit文件
systemd的核心是“unit”(单元)的概念,系统中的每一个资源,无论是服务、挂载点、设备还是套接字,都被抽象为一个unit,而我们要设置的系统服务,其配置信息就存储在以.service为后缀的unit文件中。
这些配置文件通常存放在两个主要目录:
/usr/lib/systemd/system/:存放软件包安装时默认创建的服务文件,不建议手动修改。/etc/systemd/system/:存放系统管理员创建或修改的服务文件,优先级更高,是自定义服务的首选位置。
一个典型的.service文件由三个部分组成:
- [Unit]:定义服务的元数据,如描述、依赖关系等。
- [Service]:定义服务的具体行为,如启动命令、重启策略、运行用户等。
- [Install]:定义服务如何被“启用”,即在哪个目标下创建符号链接以实现开机自启。
创建自定义系统服务:一个实践案例
假设我们有一个简单的Python脚本/opt/myapp/app.py,我们希望它作为一个后台服务持续运行。
第一步:准备应用程序
确保你的脚本或应用程序存在,一个简单的Python脚本:

# /opt/myapp/app.py
import time
while True:
with open('/var/log/myapp.log', 'a') as f:
f.write(f"Application is running at {time.ctime()}n")
time.sleep(10)
并赋予其执行权限:chmod +x /opt/myapp/app.py。
第二步:创建Unit文件
在/etc/systemd/system/目录下创建一个名为myapp.service的文件:
[Unit] Description=My Custom Python Application Service After=network.target [Service] Type=simple User=root ExecStart=/usr/bin/python3 /opt/myapp/app.py Restart=on-failure RestartSec=5s [Install] WantedBy=multi-user.target
文件解析:
Description:服务的描述信息,便于识别。After=network.target:确保在网络服务启动后再启动此服务。Type=simple:默认类型,表示ExecStart启动的进程就是服务的主进程。User=root:指定运行服务的用户,出于安全考虑,建议使用非root用户。ExecStart:启动服务的核心命令,必须使用绝对路径。Restart=on-failure:当服务异常退出时,自动重启。RestartSec=5s:重启前等待5秒。WantedBy=multi-user.target:表示当系统进入多用户模式(命令行界面)时,自动启动此服务。
常用systemctl管理命令
创建好unit文件后,就可以使用systemctl命令来管理服务了,以下是一些最常用的命令:
| 命令 | 功能描述 |
|---|---|
systemctl start myapp |
立即启动 myapp 服务 |
systemctl stop myapp |
立即停止 myapp 服务 |
systemctl restart myapp |
重启 myapp 服务 |
systemctl reload myapp |
重新加载服务配置(如果服务支持) |
systemctl status myapp |
查看服务的详细运行状态 |
systemctl enable myapp |
设置服务为开机自启 |
systemctl disable myapp |
取消服务的开机自启 |
systemctl daemon-reload |
修改unit文件后,重新加载配置 |
操作流程:

- 创建或修改
/etc/systemd/system/myapp.service文件。 - 运行
systemctl daemon-reload让systemd识别新的配置。 - 运行
systemctl start myapp启动服务。 - 运行
systemctl status myapp检查是否成功。 - 运行
systemctl enable myapp设置开机自启。
故障排查与日志查看
如果服务无法启动,systemctl status myapp会提供简要的错误信息,要获取更详细的日志,可以使用journalctl工具:
# 查看指定服务的所有日志 journalctl -u myapp.service # 实时跟踪服务日志 journalctl -u myapp.service -f
通过日志,通常可以定位到脚本错误、权限问题或路径错误等根本原因。
相关问答FAQs
Q1: 我修改了 .service 文件后,为什么服务的行为没有更新?
A1: 这是因为 systemd 在启动时已经将 unit 文件的内容读入内存,当你手动修改了磁盘上的 .service 文件后,需要通知 systemd 重新加载这些配置,请务必在修改后执行 systemctl daemon-reload 命令,然后再进行 restart 或其他操作,这样更改才能生效。
Q2: systemctl enable 和 systemctl start 有什么本质区别?
A2: 它们的用途完全不同。systemctl start myapp 是一个即时操作,它告诉 systemd 立即启动 myapp 服务,但这次启动在系统重启后不会保留,而 systemctl enable myapp 是一个持久化设置,它会在系统的启动目标目录(如 /etc/systemd/system/multi-user.target.wants/)中创建一个指向服务文件的符号链接,确保下次系统开机时,该服务会自动启动,一个新服务的标准配置流程是先 start 测试运行,确认无误后再 enable 设置开机自启。
【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!