服务器宕机后还在手动重启服务?十分钟教你编写自启动脚本

来自底层程序员的仰望

6小时前 · 浙江汉朔电子科技公司北京分公司Java工程师 优质科技领域创作者

开头说几句

最近的疫情仍然是很严重,在这样的情况之下,希望各位小伙伴可以遵循政府的号召在家中进行自我隔离。

同样的祝愿大家平安度过这次考验。

今天我们做一个简单的脚本实现Centos中各种服务的自动启动。

希望大家在这里可以学到一点点用得到的知识,同样也非常高兴大家能跟我交流沟通。

为什么我们需要自启动?

无论是云端服务器还是本地的服务器,一定难免出现宕机的情况。

那么在出现这种情况的时候我们未必能第一时间处理问题。

在系统宕机重启后,自启动脚本能够在第一时间里启动我们的服务,尽可能的减少因不能及时处理造成的损失。

是否所有的应用都需要通过脚本实现自启动?

并非所有的应用都需要通过脚本实现,大多数的服务化应用都已经支持开机启动,我们只需要对系统服务进行设定即可。

需要我们手动实现自启动的服务,多为源码编译(如Redis)或解压可直接运行的软件(如Tomcat、Zookeeper等)。

正式开始

环境设定

在开始脚本编写之前,我们首先对环境进行设定,即描述我们服务器中包含哪些需要设定自启动的软件。

这里我们设定服务器中包含软件:Mysql,Zookeeper,Redis,FastDfs,Nginx,Tomcat,Mongo,EmqX,Ntpd

对于上述软件,我们简单的介绍一下:

Mysql:关系型数据库,我们使用rpm的方式进行安装

Zookeeper:分布式服务框架,无需安装解压即用

Redis:缓存数据库,源码编译方式进行安装

FastDfs:文件服务器,源码编译方式进行安装

Nginx:HTTP和反向代理服务器,源码编译方式进行安装

Tomcat:WEB应用服务器,无需安装解压即用

Mongo:基于分布式文件存储的数据库,无需安装解压即用

EmqX:高可用性消息队列,我们使用rpm安装方式

Ntpd:时间服务器,使用yum进行安装

配置文件设计

安装状态:即服务器中是否安装某个应用,若没有安装则不执行启动命令避免报错

安装路径:一般来说我们应用安装目录并不固定,所以需要对安装路径进行配置

配置文件路径:有些应用启动需要依赖于配置文件,这里需要对应用使用的配置文件路径进行配置

Java安装路径:zookeeper以及tomcat的启动会依赖于Java环境,我们需要在脚本中指定Java环境否则会导致启动失败

根据上述的环境设定,我们编写配置文件autoStart.conf内容如下

# AutoStartConfig

# 0:true 1:false

## java config

JAVA_INSTALL_PATH=/usr/local/java/jdk1.8.0_151

## redis config

IS_INSTALL_REDIS=0

REDIS_PATH=/app/software/redis

REDIS_CONFIG_PATH=/etc/redis/6379/redis.conf

## emqx config

IS_INSTALL_EMQX=0

## zookeeper config

IS_INSTALL_ZOO=0

ZOO_PATH=/app/software/zookeeper-3.4.9

## mysql config

IS_INSTALL_MYSQL=0

## file fdfs config

IS_INSTALL_FDFS=0

FDFS_CONFIG_PATH=/etc/fdfs/

NGINX_PATH=/opt/nginx/

## mongodb config

IS_INSTALL_MONGO=0

MONGO_PATH=/app/software/mongo

MONGO_CONFIG_PATH=/etc/mongo/mongo.conf

## tomcat config

IS_INSTALL_TOMCAT=0

TOMCAT_PATH=/app/software/tomcat

## ntp config

IS_INSTALL_NTP=0

脚本编写

呐~我们准备工作基本都做完了,接下来我们就开始搞脚本了。

根据上面我们设定的配置文件,我们的脚本需要首先判断是否安装了该软件。

然后根据配置文件中的安装目录以及应用配置文件对应用进行启动。

值得注意的是,有些应用会有相应的依赖关系,就像上面说到的zookeeper、tomcat对Java环境的依赖。

再有就是我们的启动可能会有一定的顺序,简单来说,我们开发的应用一般都部署在tomcat中,如果我们开发的应用需要依赖到zookeeper、redis等等这些服务的时候,就需要优先启动依赖服务。

所以我们所行将tomcat放在最后进行启动。

最后的脚本大概就是这个样子:

#!/bin/bash

#chkconfig:  2345 81 96

#description: market

## author:来自底层程序员的仰望

. /etc/autoStart/autoStart.conf

export JAVA_HOME=${JAVA_INSTALL_PATH}

export PATH=.:$JAVA_HOME/bin:$PATH

export PATH=.:/usr/local/bin:$PATH

export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

function startTomcat() {

    ${TOMCAT_PATH}/bin/startup.sh

}

function startZoo() {

    ${ZOO_PATH}/bin/zkServer.sh start

}

function startRedis() {

    ${REDIS_PATH}/src/redis-server ${REDIS_CONFIG_PATH}

}

function startEmqx() {

    systemctl start emqx

}

function startMysql() {

    systemctl start mysqld

}

function startFdfsAndNginx() {

    fdfs_trackerd ${FDFS_CONFIG_PATH}/tracker.conf

    fdfs_storaged ${FDFS_CONFIG_PATH}/storage.conf

    ${NGINX_PATH}/sbin/nginx

}

function startNtp() {

    systemctl start ntpd

}

function startMongo() {

    ${MONGO_PATH}/bin/mongod -f ${MONGO_CONFIG_PATH}

}

function main() {

    if [[ ${IS_INSTALL_REDIS} -eq 0 ]]; then

        startRedis

    fi

    if [[ ${IS_INSTALL_EMQX} -eq 0 ]]; then

        startEmqx

    fi

    if [[ ${IS_INSTALL_ZOO} -eq 0 ]]; then

        startZoo

    fi

    if [[ ${IS_INSTALL_MYSQL} -eq 0 ]]; then

        startMysql

    fi

    if [[ ${IS_INSTALL_FDFS} -eq 0 ]]; then

        startFdfsAndNginx

    fi

    if [[ ${IS_INSTALL_MONGO} -eq 0 ]]; then

        startMongo

    fi

    if [[ ${IS_INSTALL_TOMCAT} -eq 0 ]]; then

        startTomcat

    fi

    if [[ ${IS_INSTALL_NTP} -eq 0 ]]; then

        startNtp

    fi

}

main

将脚本添加至开机启动

首先创建文件夹 mkdir -p /etc/autoStart/ 用于存放我们的配置文件

移动启动脚本 mv autoStart.sh /etc/rc.d/init.d/

赋予脚本运行权限 chmod +x /etc/rc.d/init.d/autoStart.sh

添加开机启动 chkconfig --add autoStart.sh && chkconfig autoStart.sh on

在上一步中需要注意的一点,那就是脚本的开头必须要包含该描述:

#!/bin/bash

#chkconfig:  2345 81 96

#description: market

在调试过程中遇到的困难

在最初编写时,我并没有在脚本中添加Java环境,导致zookeeper以及tomcat均无法启动。

所以我在脚本中加入了java环境的配置:

export JAVA_HOME=${JAVA_INSTALL_PATH}

export PATH=.:$JAVA_HOME/bin:$PATH

export PATH=.:/usr/local/bin:$PATH

export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

最后说几句

这样就可以啦,如果你有安装其他的软件,就需要各位手动去修改一下代码了。

希望该篇能够给大家一点点小的帮助,非常希望大家能与我交流沟通。

如果大家有更好的方式方法可以贴出来哦!!!

2410阅读

搜索

100个必会的shell脚本

linux系统脚本详解

shell脚本入门

运维自动化脚本

linux脚本100例

三个vlog脚本案例

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 195,783评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,360评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 142,942评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,507评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,324评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,299评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,685评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,358评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,652评论 1 293
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,704评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,465评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,318评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,711评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,991评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,265评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,661评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,864评论 2 335

推荐阅读更多精彩内容