运维经验分享(二)-- Linux Shell之ChatterServer服务控制脚本二次优化
====================================分割线======================================
最近开发人员提出新的需求,想将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脚本,其中,也遇到了一些语法不清楚的情况,在此记录一下已备后续使用
相关文章
- 重新开始:远程服务器 Linux 的重生(重启远程服务linux)
- Linux服务器上的文件共享服务(linux服务器文件共享)
- “Linux论坛:寻找那个最佳之选”(linux论坛哪个好)
- Linux查看端口信息的快捷方式(linux获取端口信息)
- 远程控制 Linux:实现跨越时空的管理(远程控制linux)
- Linux DFS: 了解分布式文件系统的基础(linuxdfs)
- Linux上部署MySQL服务(linux版mysql)
- 服务的搭建搭建Linux下的FTP服务器(linux下ftp)
- 实现Linux下多版本JDK共存(linux多版本jdk)
- Linux硬盘共享:开启一次全新体验(linux共享硬盘)
- 服务搭建Linux下的PPTP服务,轻松搞定!(linux搭建pptp)
- Linux下简单绘图精彩之旅(linux绘图)
- Linux进程控制实验:洞悉更多系统设置(linux进程控制实验)
- 极速提升:如何在Linux上加装硬盘(加硬盘linux)
- Linux开机自动启动SVN服务(linux开机启动svn)
- Linux实现大小写转换的简单方法(linux大写转小写)
- Linux发展历程:从分支到茁壮成长(linux的分支)
- Linux系统下关闭防火墙(关闭linux的防火墙)
- Linux 蜂鸣器操作指南:如何使用命令行控制蜂鸣器(linux蜂鸣器命令)
- 轻松学习Linux:安装libc6的详细步骤(linux安装libc6)
- 使用 Linux 实现内网映射到外网的配置方法(linux内网映射外网)
- Linux下改变权限的命令使用指南(linux改权限命令)
- Linux自学指南:让你轻松上手!(linux如何自学)
- 「轻松上手,Linux升级的命令」(linux升级命令)
- Linux查看服务状态:一招鲜(linux 查看服务列表)
- Linux下的触摸屏驱动:实现手指触控精准控制(触摸屏的linux驱动)
- Linux实现实时调度的新思路(linux实时调度)
- 权限控制Linux自由支配:创建用户及目录权限管理(linux创建用户及目录)
- Linux下FTP服务的配置之路(linux下ftp配置)
- Linux下启动服务:解锁你的数字之门(linux下启动服务)