一,背景介绍
在Linux系统中,systemd是主流初始化系统和服务管理器。我们可以通过编写systemd服务单元文件,方便地进行服务启动、停止、重启及开机自动启动管理。
本文以Tomcat为例子,手写一个systemd服务单元文件,使得tomcat服务可以直接被systemd管理。
二,为什么要编写自定义systemd服务单元?
1.系统默认没有提供对应服务。
2.需要定制启动参数或环境变量
3.方便集成自动启动、依赖管理以及日志收集
4.简化运维操作,统一管理服务生命周期
三、systemd单元文件基础结构
一个systemd服务文件一般位于 /etc/systemd/system/ 目录下,文件名以 .service 为结尾。
标准模版:
[Unit]
Description=服务描述信息
After=依赖服务或目标(比如 network.target)
[Service]
Type=simple / forking / notify / oneshot # 启动类型
User=运行用户
Group=运行用户组
Environment=环境变量定义
ExecStart=启动命令及参数
ExecStop=停止命令及参数
Restart=重启策略(可选)
[Install]
WantedBy=目标(如 multi-user.target)
四,实战:为Tomcat编写systemd服务文件[Service] 定义服务启动和停止的细节
[Unit]
Description=Apache Tomcat Web Application Container
After=network.target
[Service]
Type=forking
User=ka1ou
Group=ka1ou
Environment=JAVA_HOME=/usr/lib/jvm/java-11-openjdk
Environment=CATALINA_PID=/opt/apache-tomcat-10.1.43/temp/tomcat.pid
Environment=CATALINA_HOME=/opt/apache-tomcat-10.1.43
Environment=CATALINA_BASE=/opt/apache-tomcat-10.1.43
ExecStart=/opt/apache-tomcat-10.1.43/bin/startup.sh
ExecStop=/opt/apache-tomcat-10.1.43/bin/shutdown.sh
Restart=on-failure
[Install]
WantedBy=multi-user.target
关键点说明:
[Unit]
Description:简短描述服务
After=network.target 网络服务启动后再启动tomcat,保证网络环境可用。
[Service]
Type=forking 说明启动脚本会fork一个子进程,父进程退出
User和Group 指定服务运行的用户权限,避免用root运行,提高安全性
Environment 设置环境变量,方便脚本引用
ExecStart 和 ExecStop 定义启动和停止命令(脚本)
Restart=on-failure 自动重启失败的服务(可不写)
[Install]
WantedBy=multi-user.target 允许服务在多用户模式下自动启动
补充:
forking:启动脚本会fork一个子进程后让父进程退出,systemd会认为子进程是服务的主进程。主要用于传统的后台服务程序(tomcat,mysql,httpd,等)。需要通过PIDFile= 来让systemd跟踪子进程,否则管理不精确。
simple:默认型,服务启动后,ExecStart里运行的主进程不会fork,直接运行。systemd会认为执行ExecStart进程就是服务的主进程,不需要额外判定进程是否完成启动。大多数为前台运行的守护进程(gunicorn,nginx -g “daemon off;”,各类Python/NodeJS应用)
oneshot:用于执行一次性命令,systemd会等待命令执行完毕。不会持续运行服务(除非结合RemainAfterExit=yes)。适合运行初始化脚本,配置任务等。主要运用在启动时只需要运行一次的命令(加载内核模块、设计环境变量、挂载磁盘等)
notify:需要服务程序本身支持systemd通知机制(通过sd_notify),systemd会等待服务显式发送READY=1消息才认为启动完成。高级功能,一般用于需要精准控制启动阶段的服务(如etcd,docker)。用于对启动完成有严格定义的服务,必须调用libsystemd的通知API。
五、配置完成后的操作流程
1.将service文件保存到 /etc/systemd/system/tomcat.service
2.sudo systemctl daemon-reload 重新加载systemd配置
3.sudo systemctl start tomcat 启动服务
4.sudo systemctl status tomcat 查看服务状态
5.sudo systemctl enable tomcat 设计开机自启
6.sudo systemctl stop tomcat 停止服务
六、常见问题以及排查建议
=>服务无法启动
检查ExecsStart路径和权限是否正确
查看journalctl -u tomcat 获取详细日志
=>权限问题
确认user运行用户对tomcat目录有读写权
=>服务未开机启动
确认执行了systemctl enable命令,并无报错
=>服务崩溃自动重启无效
检查Restart 参数设置是否正确
七、总结
会写systemd service文件十分必要,可以更好地控制服务状态,实现自动化管理,帮助运维进行日志管理,同时做到安全隔离,从而提升运维效率。