Linux服务器开机自启用systemd管理的标准做法
Linux服务器上的应用服务要随开机自动拉起,常见做法是把启动命令写进/etc/rc.local,或者塞到cron的@reboot里。这两条路在老旧系统上能用,但缺少依赖管理、失败重试、日志采集,服务崩溃后不会自动恢复。现代Linux发行版统一用systemd管理开机自启,通过服务单元文件(service unit)声明启动命令、依赖关系和重启策略,systemd按依赖图并行拉起,比rc.local按顺序执行更可控。
systemd服务单元文件怎么写才规范
以部署一个Java应用服务为例,服务单元放在/etc/systemd/system/myapp.service:
[Unit]
Description=My Java Application Service
After=network-online.target mysql.service
Wants=network-online.target
[Service]
Type=simple
User=appuser
Group=appuser
WorkingDirectory=/opt/myapp
ExecStart=/usr/bin/java -Xms1g -Xmx2g -jar /opt/myapp/app.jar
Restart=on-failure
RestartSec=5
StartLimitIntervalSec=60
StartLimitBurst=5
EnvironmentFile=/etc/myapp/env.conf
[Install]
WantedBy=multi-user.target
After声明网络和数据库先就绪,Wants是弱依赖不影响启动顺序;Type=simple适合前台长驻进程,如果程序会fork到后台则要用Type=forking并配合PIDFile;Restart=on-failure让非正常退出自动拉起,RestartSec控制重试间隔,StartLimitBurst限制60秒内最多拉起5次,防止崩溃循环把服务器拖垮。
systemd服务的启用、状态检查与开机启动验证
单元文件写好以后执行:
# 重载单元定义
systemctl daemon-reload
# 设置开机自启
systemctl enable myapp.service
# 立即启动
systemctl start myapp.service
# 查看运行状态与开机自启状态
systemctl status myapp.service
systemctl is-enabled myapp.service
# 查看启动日志
journalctl -u myapp.service -n 100
enable会创建/etc/systemd/system/multi-user.target.wants/下的符号链接,这是开机自启生效的标志。is-enabled输出enabled才是真正设置成功。
服务器开机自启服务依赖与故障排查要点
服务启动顺序依赖容易踩坑:数据库未就绪就拉起业务进程。解决办法是服务里加等待逻辑,或者用systemd的ExecStartPre执行健康检查脚本,就绪前返回非零退出码让systemd延迟重启。另外EnvironmentFile里的变量用Key=Value格式,不能加export;ExecStart里路径必须用绝对路径,相对路径会导致启动失败但systemd不报错。
排查自启失败:先systemctl status看failed原因,再journalctl -u查看日志时间戳;常见是权限问题(用户目录不可读)、ExecStart命令不存在、或单元文件语法错误。改完单元文件必须daemon-reload,否则修改不生效。以上步骤覆盖了Linux服务器systemd服务从编写、启用、启动到故障排查的完整链路。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/linux-fu-wu-qi-kai-ji-zi-qi-pei-zhi-shi-zhan-systemd-fu-wu/