zl程序教程

您现在的位置是:首页 >  系统

当前栏目

运维经验分享(二)-- Linux Shell之ChatterServer服务控制脚本二次优化

Linux控制服务运维shell 优化 -- 分享
2023-09-14 09:01:02 时间

====================================分割线======================================

最近开发人员提出新的需求,想将ChatterServer服务控制脚本放到ChatterServer根目录下的bin目录下,并向一次性可以部署多个实例,因此这一个需求引发了多个改变:

1.不再使用service进行控制,仍然保留status、start、stop和restart功能

2.BASEDIR不再使用绝对路径而要使用相对路径,例如BASEDIR=..

3.SERVICEPORT要从ChatterServer根目录下的conf目录中的文件中读取

4.日志目录logs将不再手动创建,控制脚本需要自己创建logs目录

针对以上4点变更,改进如下

1.去掉service控制,只需要将此脚本放到ChatterServer根目录下的bin目录下执行(实际上更简单了)

2.既然要使用相对路径而不使用绝对路径就要正确设置Shell脚本的当前工作目录,否则非但脚本不好用(log和pid都无法正常生成),还会导致ChatterServer的核心命令行无法使用(无法读取到相对路径下的配置文件)

3.要想SERVICEPORT从ChatterServer根目录下的conf目录中的文件中读取,非常简单,但疑难问题在于排查上,例如grep对dos文件格式(file format)的文件非常不友好,会对脚本中后面的命令产生巨大影响(特别是echo以及变量(以$开头的字符串)几乎会乱掉),因此在使用grep前,必须将此文件的内容通过dos2unix命令来转化,除非开发人员乐意将文件格式从dos手动改为unix(可以参考《UNIX/Linux环境编程必须需要注意的问题总结》)

4.相当于多了一层异常检测而已,比较简单,看新的ChatterServer服务控制脚本就会明白。

经过二次“优化”改造的脚本如下:


#chkconfig: 345 86 14 #description: Startup and shutdown script for ChatterServer(Port:$SERVICEPORT)) VERSION=1.0.0-snapshot BASEDIR=.. # choose LOGDIR as standard of work directory LOGDIR=$(pwd)/$BASEDIR/logs
#SERVICEPORT=29093 #SERVICEPORT=`grep ^port $(pwd)/../conf/constant.properties | awk -F = {print $2}` # NOTE: $(pwd)/../conf/constant.properties file fileformat must be unix NOT dos in shell scripts, or will cause some unknown error # NOTE: grep is vrey sensitive to dos fileformat or unix fileformat # apt-get install dos2unix PORTFILE=$(pwd)/../conf/constant.properties
ARGS="-Xms2g -Xmx4g -Xmn4g -Xss128k -XX:MaxPermSize=64m -XX:-UseParallelGC -XX:+UseParallelOldGC -XX:ParallelGCThreads=4 -XX:+UseConcMarkSweepGC -XX:MaxTenuringThreshold=30 -XX:SurvivorRatio=6" # -Xms2g -Xmx2g -Xmn2g -Xss128k -XX:MaxPermSize=64m -XX:-UseParallelGC -XX:+UseParallelOldGC -XX:ParallelGCThreads=4 -XX:+UseConcMarkSweepGC -XX:MaxTenuringThreshold=30 -XX:SurvivorRatio=6 status() {     # The judgment priority: pid   port   piffile
    # netstat run by common user will get some error output, so we put those error outout to /dev/null
    if [[ $(netstat -anop 2 /dev/null | grep $SERVICEPORT | grep LISTEN) || -f $PIDFILE ]];then
        echo "ERROR: pidfile $PIDFILE exist, ChatterServer(Port:$SERVICEPORT) has started with pid $(cat $PIDFILE)"
            ## $! --  Expands to the process ID of the most recently executed background (asynchronous) command.
            # For java performance issue, port 29092 will listen latter, we will waiting for 2 second
            #pid=$(ps -ef | grep java | grep $BASENAME | grep -v grep | awk {print $2})
            pid=$(netstat -anop 2 /dev/null | grep $SERVICEPORT | grep LISTEN | awk {print $7} | awk -F / {print $1})
            # For java performance issue, port 29092 will listen latter, so we change judgment conditions
            if [[ $(netstat -anop 2 /dev/null | grep $SERVICEPORT | grep LISTEN) || -f $PIDFILE ]]; then
                echo "[ $(date +"%D %T") ] SUCCESS: ChatterServer(Port:$SERVICEPORT) started with pid $(cat $PIDFILE) "  $LOGDIR/service.log
            #echo "[ $(date +"%D %T") ] SUCCESS: ChatterServer started with pid $(cat $PIDFILE) "  $LOGDIR/service.log
            echo "[ $(date +"%D %T") ] ERROR: ChatterServer(Port:$SERVICEPORT) start failed "  $LOGDIR/service.log
            echo "[ $(date +"%D %T") ] SUCCESS: ChatterServer(Port:$SERVICEPORT) stop OK with TERM "  $LOGDIR/service.log
            echo "[ $(date +"%D %T") ] SUCCESS: ChatterServer(Port:$SERVICEPORT) stop OK with KILL "  $LOGDIR/service.log
            echo "[ $(date +"%D %T") ] ERROR: ChatterServer(Port:$SERVICEPORT) stop failed "  $LOGDIR/service.log

--end--

====================================分割线======================================

运维经验分享作为一个专题,目前共7篇文章


shell 脚本实现 k8s 集群环境下指定 ns 资源的 yaml 文件备份 在基于 `k8s` 平台的容器化部署环境中,有时候需要快速的实现部署文件的迁移备份,当 `k8s` 平台部署一个 `app` 时,都会相应的产生一堆 `yaml` 文件,如果 `yaml` 文件数量较少,我们可以人工手动的方式进行拷贝,但是当 `yaml` 文件数量多,并且该 `k8s` 平台部署了多个 `app` 时,如果在采用...
《Shell 脚本速查手册》电子版地址 编写Bash脚本耗时长?不稳定?有妙招!阿里云开发者社区和linux中国开源社区联手推出《Shell脚本速查手册》,为运维工程师提供一个快速、便捷的查询手册,以共开发者查询自己日常工作中常用的命令和脚本。
使用Shell脚本进行语句循环 除了上一篇文章介绍的if条件语句之外,(本文不再介绍if条件语句,感兴趣的小伙伴可以参考上一章介绍的​ ​使用Shell脚本进行条件测试​​)作为一种脚本编程语言,Shell同样包含循环,分支等其他程序控制结构,从而能够轻松完成更加复杂,强大的功能。本文将介绍for、while、case语句的具体应用。
使用Shell脚本进行条件测试 ⭐本文介绍⭐ 在简单的Shell程序中,各条语句将按先后顺序依次执行,从而实现批处理的自动化过程,然而,单一的顺序结构使得脚本过于机械化,不够 智能 ,难以处理更加灵活得系统任务。本文将学习如何进行条件测试,并通过正确使用if语句,使Shell脚本具有一定得 判断 能力,以根据不同得的条件来完成不同的管理任务。
使用Shell脚本安装MySQL(二) ⭐本文介绍⭐ 随着Linux系统在企业中的应用越来越多,服务器的自动化管理也变得越来越重要。在Linux服务器的自动化维护工作中,除了计划任务的设置以外,Shell脚本的应用也是非常重要的一部分。本文将主要介绍Shell脚本的基础,变量使用等知识。
Shell 脚本的编写总结 这篇文章主要是为了记录一下Shell脚本的使用语法,前几天写了一个shell脚本,其中,也遇到了一些语法不清楚的情况,在此记录一下已备后续使用