jfinal 项目使用 systemd 机制 linux 开机自启动

    前段时间在公司机房部署新项目,用了一下 systemd 机制实现 jfinal 开机自启动。

    以往项目都部署在阿里、腾迅等云服务器上,大厂的机房几乎不存在停电的可能性,但公司自建机房必须要考虑(公司UPS已坏)。

   步骤如下:

1: 修改 jfinal 官方提供的启动脚本 jfinal.sh 文件,在 java 命令之前添加全路径

/usr/bin/java -Xverify:none ${JAVA_OPTS} -cp ${CP} ${MAIN_CLASS} &

   以上 /usr/bin/java 改成你 linux 环境的实际地址,可以通过 which java 获取到该值。注意这步是必须的,不能省,jfinal 官方提供的 jfinal.sh 脚本默认只有 java 没有路径。

2: 创建 systemd 规范的 service 脚本,使用命令 vim /etc/systemd/system/jfinal.service

[Unit]
Description = JFinal Service
After = network.target

[Service]
Type = forking
WorkingDirectory = /opt/myproject
ExecStart = /opt/myproject/jfinal.sh start

[Install]
WantedBy = multi-user.target

    以上 jfinal.service 文件内容,Description 字段可随意。WorkingDirectory 指向你的部署项目的路径,如果不配置,其项目的日志会跑到 linux 根目录之下。ExecStart 配置为项目启动命令,注意要使用全路径名。

3: 重启 systemd,使用如下命令

systemctl daemon-reload

4: 将 jfinal.server 添加到 systemd 之中

systemctl enable jfinal.service

    添加完以后,既可实现开机自启动,又能通过 systemd 进行管理,例如:

# 启动项目
systemctl start jfinal
# 关闭项目
systemctl stop jfinal
# 重启项目
systemctl restart jfinal
# 查看状态
systemctl status jfinal

5: 扩展知识

    systemd 机制是从 centos 7 引进,并代替了 centos 6 的 init 机制,配置更方便、简单,建议使用。有很多常用项目安装后会自动  xxx.service 文件,只需要将其复制到 /etc/systemd/system 之下,通过 systemctl enable xxx 开启即可使用,例如 nginx、redis 都提供了 nginx.service、redis.service 这样的脚本。

6: 去除功能,可通过 systemctl disable jfinal

7: 项目挂掉之后自动启动脚本

[Unit]
Description = JFinal Service
After = network.target

[Service]
Type = forking
Restart = on-failure
RestartSec = 3s
WorkingDirectory = /opt/myproject
ExecStart = /opt/myproject/jfinal.sh start

[Install]
WantedBy = multi-user.target

    以上配置支持项目在挂掉之后自动启动,相对于前面的配置仅多了 Restart、RestartSec 两个配置。

评论区

steven_lhcb_9527

2022-12-05 20:39

不愧是大佬,很实用

zzutligang

2022-12-08 20:23

@JFinal 一直在这样用,但同时也有一个问题没解决。项目如果和mysql部署在一台机器上,那这个自启动项就必须要在mysql启动后才能启动,否则连不上数据库,启动就失败了。怎么编辑那个service文件,让服务在mysqld服务启动后才启动项目呢?

JFinal

2022-12-08 21:33

@zzutligang After 后面配置一下 mysql

airfish

2022-12-09 15:08

同一问题!

zzutligang

2022-12-12 10:29

@JFinal 是这样写吗:After = network.target, mysqld

steven_lhcb_9527

2022-12-16 10:09

After 后面是依赖的服务名

redo100

2023-03-18 19:11

@zzutligang After = network.target, mysqld.service

热门分享

扫码入社