一介闲人
一介闲人
systemd 服务配置文件统一放在:/etc/systemd/system目录下,本文以java-web.service为例
vim /etc/systemd/system/java-web.service
文件内容为:
[Unit]
# 服务描述
Description=Java Web Application
# 启动顺序:在网络启动后再运行,
After=network.target
[Service]
# 运行用户
User=root
# 工作目录(关键,必须保留)
WorkingDirectory=/project/java-web
# ================== 启动前预处理 ==================
# 1. 启动前删除旧日志(可选)
ExecStartPre=/usr/bin/rm -rf /project/java-web/main.log
# 2. 等待Redis完全就绪(可选)
ExecStartPre=/usr/bin/bash -c 'until echo > /dev/tcp/127.0.0.1/6379; do sleep 1; done'
# ================== 启动Java项目 ==================
# ========== /usr/bin/java 为jdk安装目录============
ExecStart=/usr/bin/java -jar -Xms256m -Xmx1024m java-web-0.0.1-SNAPSHOT.jar
# ================== 日志输出 ==================
StandardOutput=file:/project/java-web/main.log
StandardError=file:/project/java-web/main.log
# ================== 自动重启 ==================
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
关键参数说明
注意:文件里所有命令必须写绝对路径
# 重新加载 systemd 配置
systemctl daemon-reload
# 启动
systemctl start java-web
# 停止
systemctl stop java-web
# 重启
systemctl restart java-web
# 查看状态
systemctl status java-web
# 取消开机自启
systemctl disable java-web
问:没有配置ExecStop,可以使用systemctl stop java-web?
答:可以用 systemctl stop java-web
systemd 有默认停止机制:执行 systemctl stop 时,systemd 会:
1.给 Java 进程发送 SIGTERM 停止信号
2.等待进程正常退出
3.如果没退出,超时后发送 SIGKILL 强制杀死
4.标记服务为已停止
SpringBoot / Java 项目会正常关闭,不需要手动写 ExecStop。
问:配置了After,为何还要配置ExecStartPre
答:用法用处不同
ExecStartPre在执行 ExecStart之前,先执行一段命令/检查
相当于是启动前的前置检查 / 准备工作
After 是指定启动顺序,不管有没有准备就绪
配置ExecStart可以避免:依赖服务还没加载好 → Java 启动报错 → 自动重启 → 反复报错 的问题!
多个 ExecStartPre 执行规则:
从上到下依次执行
必须全部成功,才会执行 ExecStart
任何一个失败 → 整个服务启动失败
总结:
After= 控制启动顺序
ExecStartPre 确保依赖服务真正就绪
问:重启规则(即Restart)还有其他选项吗
答:有,Restart有5个取值
1.Restart=no,默认值,崩溃了不重启,适用于测试、一次性脚本
2.Restart=on-success,只有正常退出才重启,极少用
3.Restart=on-failure,异常退出才重启(崩溃、被强制杀),部分服务使用
4.Restart=on-abnormal,被信号杀死 / 超时才重启,极少用
5.Restart=always,只要退出就重启,Java 项目、生产环境首选
问:java-web.service文件存放的位置只有这个吗
答:有3个目录都可以放,都能达到效果
1. /usr/lib/systemd/system
谁用:系统、rpm/yum 安装的软件
特点:系统更新会覆盖
不建议手动放
2. /etc/systemd/system
谁用:管理员(你自己)
特点:永久保存、不会被覆盖、优先级最高
适合场景:自定义服务(Docker 脚本、java服务等)
3. /usr/local/lib/systemd/system
谁用:手动编译、手动安装的软件
特点:专门给 /usr/local/ 下的软件用
优先级:(从高到低)
1./etc/systemd/system/ (最高,管理员自定义)
2./usr/local/lib/systemd/system/ (手动安装软件)
3./usr/lib/systemd/system/ (最低,系统自带)
评论