java进程守护-----nohup 替换为 `systemd`(现代 Linux 系统首选)

Administrator
发布于 2025-07-31 / 1 阅读
0
0

java进程守护-----nohup 替换为 `systemd`(现代 Linux 系统首选)

前期准备

[root@xs1 /]# systemctl --version systemd 239 (239-74.0.3.al8) +PAM +AUDIT +SELINUX +IMA -APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 +SECCOMP +BLKID +ELFUTILS +KMOD +IDN2 -IDN +PCRE2 default-hierarchy=legacy    
[root@xs1 /]# ps -ef | grep java root      106229       1  0 May28 ?        01:02:28 java -Dfile.encoding=UTF-8 -jar halo.jar --spring.config.additional-location=optional:file:/root/.halo2_new/ root      226665  226575  0 09:03 pts/0    00:00:00 grep --color=auto java   
[root@xs1 app]# ls application.yaml  halo.jar  halo.log

1.要判断 Linux 服务器是否支持或已启用 systemd,查看 systemd 的版本(最直接)

systemctl --version

如果有类似输出,说明你的系统使用的是 systemd

systemd 239
+PAM +AUDIT +SELINUX +...

2.检查 systemctl 命令是否存在

which systemctl

如果输出路径,如:

/usr/bin/systemctl

说明命令存在,可以使用。

3.检查java jdk ,当前的 JDK如果不是 /usr/bin/java,而是:

使用:

which java

如果是

/opt/jdkVersion/jdk-17.0.12/bin/java

所以你希望更换成正确的 JDK 启动 Halo 服务。

开始操作:

✅ 第一步:创建 systemd 服务文件

创建文件:

sudo vim /etc/systemd/system/halo.service

粘贴以下内容(已根据你当前路径配置):

[Unit]
Description=Halo Blog Service
After=network.target
​
[Service]
User=root
WorkingDirectory=/root
Environment="JAVA_HOME=/opt/jdkVersion/jdk-17.0.12"
Environment="PATH=$JAVA_HOME/bin:$PATH"
ExecStart=/opt/jdkVersion/jdk-17.0.12/bin/java -Dfile.encoding=UTF-8 -jar /root/halo.jar --spring.config.additional-location=optional:file:/root/.halo2_new/
SuccessExitStatus=143
Restart=always
RestartSec=5
StandardOutput=journal
StandardError=journal
​
[Install]
WantedBy=multi-user.target

✅ 第二步:重新加载并启动服务

# 重新加载 systemd 配置
sudo systemctl daemon-reexec
sudo systemctl daemon-reload
​
# 启动 halo 服务
sudo systemctl start halo
​
# 设置开机自启
sudo systemctl enable halo

✅ 第三步:查看服务状态 / 日志

# 查看服务运行状态
sudo systemctl status halo
​
# 实时查看日志(比直接 cat 更稳)
sudo journalctl -u halo -f

✅ 第四步:测试守护效果

你可以测试一下:

# 模拟杀掉 halo 服务
sudo kill -9 $(pgrep -f halo.jar)
​
# 然后执行以下命令确认是否自动重启
sudo systemctl status halo

如果你看到服务自动拉起,就说明配置成功。


🧠 可选增强项(建议)

日志分离更好管理(systemd 自带)

你已经用了 halo.log,但也可以直接用 systemd 日志:

StandardOutput=journal
StandardError=journal

然后用:

journalctl -u halo -f

代替直接写 halo.log 文件,防止日志文件无限增长。



评论