用脚本运行的服务,例如Java,需要做开机自启动
开机自启动有几种方式:
- 使用 /etc/rc.local 文件
- 使用 systemd 服务
- 使用 /etc/init.d/ 脚本
- 使用 cron 的 @reboot
前面三种自己补知识,不做详细介绍
crontab 平时用于做定时任务,例如定时同步时间,刚好用来做开机启动服务
1 创建一个总的入口脚本
例如 /opt/deploy/backend/startAll.sh
下面内容仅做示例
#!/bin/bash
echo "start led interaction"
cd /opt/deploy/backend/led-interaction
/bin/bash start.sh
# 下面其他服务,继续往下加
# ...
其中,start.sh 是启动Java服务的脚本,大概如下:
#start.sh
nohup java -jar -Dspring.config.location=./application.yml *.jar > outLog.out 2>&1 &
2 加入cron
crontab -e
将以下内容插入
@reboot /opt/deploy/backend/startAll.sh >> /opt/deploy/backend/startAll.log 2>&1
至此,已经完成开机自启动服务,感觉要大功告成,重启服务器测试一下
# 重启服务器
reboot
重启,发现服务没有成功跑起
3 问题
实际上,没有大功告成!服务没有跑起来,查看Java服务的日志 outLog.out,
报错,大概就是:Java 没找到这个命令
那就是Java环境没初始化完。
解决:运行Java服务前,先把Java环境加入path,startAll.sh 脚本于是改成:
#!/bin/bash
# 初始化Java环境
JAVA_HOME=/usr/local/java/jdk1.8.0_391
JRE_HOME=/usr/local/java/jdk1.8.0_391/jre
CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
export JAVA_HOME CLASS_PATH PATH
sleep 3
# 初始化完,再执行服务
echo "start led interaction"
cd /opt/deploy/backend/led-interaction
/bin/bash start.sh
# 下面其他服务,继续往下加
# ...
测试通过,以此备忘