前段时间在公司机房部署新项目,用了一下 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 两个配置。