CentOS 开机启动脚本

288 阅读3分钟

最终结果

在 /root 目录下新建启动脚本 boot.sh

# 启动 redis
redis-server /usr/local/soft/redis/redis.conf


# nginx
nginx


# 启动 Elasticsearch
# 启动脚本 /etc/init.d/es


# 启动java程序

check_elasticsearch_boot_success(){
    result=$(curl http://localhost:9200 | grep "cluster_name" )

    while [ "$result" == "" ]
    do
    echo "result: ${result}  not running..."
    sleep 3s
    result=$(curl http://localhost:9200 | grep "cluster_name" )
    done
}

check_elasticsearch_boot_success

source /etc/profile.d/java.sh
cd /home/source/api
nohup java -Xmx256m -Xms128m -Xss256k  -jar hhw-admin.jar --spring.profiles.active=test > logs/admin.log 2>&1 &
nohup java -Xmx256m -Xms128m -Xss256k  -jar hhw-api.jar --spring.profiles.active=test > logs/api.log 2>&1 &

添加执行权限 chmod +x boot.sh
编辑 /etc/rc.d/rc.local ,在结尾处输入 sh /root/boot.sh &
/etc/rc.d/rc.local 添加执行权限 chmod +x /etc/rc.d/rc.local
然后 reboot 测试效果

心路历程

在 /root 目录下新建启动脚本 boot.sh

# 启动 redis
redis-server /usr/local/soft/redis/redis.conf


# nginx
nginx


# 启动 Elasticsearch
# 启动脚本 /etc/init.d/es


# 启动java程序

source /etc/profile.d/java.sh
cd /home/source/api
nohup java -Xmx256m -Xms128m -Xss256k  -jar hhw-admin.jar --spring.profiles.active=test > logs/admin.log 2>&1 &
nohup java -Xmx256m -Xms128m -Xss256k  -jar hhw-api.jar --spring.profiles.active=test > logs/api.log 2>&1 &

添加执行权限 chmod +x boot.sh
编辑 /etc/rc.d/rc.local ,在结尾处输入 sh /root/boot.sh &
/etc/rc.d/rc.local 添加执行权限 chmod +x /etc/rc.d/rc.local
然后 reboot 测试效果

效果不理想,并未启动成功,原因是我的java程序里使用了 Elasticsearch ,Elasticsearch 启动不成功的话,我的程序也会失败

于是 我想着启动java程序前,延时一会儿,等Elasticsearch启动了,再启动java程序

于是 脚本变成了这样

# 启动 redis
redis-server /usr/local/soft/redis/redis.conf


# nginx
nginx


# 启动 Elasticsearch
# 启动脚本 /etc/init.d/es


# 启动java程序

# 休眠1分钟
sleep 3s

source /etc/profile.d/java.sh
cd /home/source/api
nohup java -Xmx256m -Xms128m -Xss256k  -jar hhw-admin.jar --spring.profiles.active=test > logs/admin.log 2>&1 &
nohup java -Xmx256m -Xms128m -Xss256k  -jar hhw-api.jar --spring.profiles.active=test > logs/api.log 2>&1 &

reboot 再次测试

结果发现成功了一个,另一个失败了。于是我又改成写个循环,使用 [ $(ps -aux | grep elasticsearch | wc -l) -le 1 ] 判断Elasticsearch是否启动成功,不成功就休眠3秒;直到Elasticsearch启动成功。

代码变成了这样:

# 启动 redis
redis-server /usr/local/soft/redis/redis.conf


# nginx
nginx


# 启动 Elasticsearch
# 启动脚本 /etc/init.d/es


# 启动java程序

while [ $(ps -aux | grep elasticsearch | wc -l) -le 1 ]
do
echo -e "检测一次,未启动"
# 如果Elasticsearch还未启动,休眠3秒再重新检测是否启动
sleep 3s
done

source /etc/profile.d/java.sh
cd /home/source/api
nohup java -Xmx256m -Xms128m -Xss256k  -jar hhw-admin.jar --spring.profiles.active=test > logs/admin.log 2>&1 &
nohup java -Xmx256m -Xms128m -Xss256k  -jar hhw-api.jar --spring.profiles.active=test > logs/api.log 2>&1 &

reboot 再次尝试

成功了,🎉✨✨

本着负责人的态度,第二天,我又reboot 测试了一下,哦豁,又有一个程序启动失败了。打开日志一看,还是同样的问题,Elasticsearch未启动成功。

我就想 ps -aux | grep elasticsearch | wc -l 是通过判断输出的条数大于 1 来决定是否启动的,二Elasticsearch启动是比较慢的,有没有可能Elasticsearch还在启动的过程中,ps -aux | grep elasticsearch | wc -l 返回的条数就大于1了呢?

验证之后,果然是这样。

然后改成判断 curl http://localhost:9200 的返回结果来判断是否启动成功

# 启动 redis
redis-server /usr/local/soft/redis/redis.conf


# nginx
nginx


# 启动 Elasticsearch
# 启动脚本 /etc/init.d/es


# 启动java程序

check_elasticsearch_boot_success(){
    result=$(curl http://localhost:9200 | grep "cluster_name" )

    while [ "$result" == "" ]
    do
    echo "result: ${result}  not running..."
    sleep 3s
    result=$(curl http://localhost:9200 | grep "cluster_name" )
    done
}

check_elasticsearch_boot_success

source /etc/profile.d/java.sh
cd /home/source/api
nohup java -Xmx256m -Xms128m -Xss256k  -jar hhw-admin.jar --spring.profiles.active=test > logs/admin.log 2>&1 &
nohup java -Xmx256m -Xms128m -Xss256k  -jar hhw-api.jar --spring.profiles.active=test > logs/api.log 2>&1 &

这回总可以了吧 等待时间验证

鸣谢