shell脚本规划化模板
shell脚本规划化模板
Linux运维过程中,shell脚本是不可缺少的工具,但是每个运维人员编程的习惯都不一样,很多时候就是实现某个功能,写出来的脚本都是烂七八糟的。
脚本必须规范化,应该从以后几个方面着手:
1、脚本必须记录日志,尽可能多的把执行命令操作写入日志当中,有便于日后可以追踪;
2、脚本尽可能实现函数化模块化,函数名具有可读性;
3、脚本必须要有传入参数;
4、脚本执行必须是单进程的,即该脚本某个时间段只能运行一次;
5、脚本执行过程中必须加锁机制;
6、脚本注释是不可缺少的;
7、脚本最好统一入口(main函数),个人喜好;
大致分为这7点,运维必须规范化流程化,不做流氓运维,对自己工作负责,也便于其他同事方便查看或接手,我个人不推崇脚本复杂化,搞一堆大家看不懂的。
举例说明,上线是运维不可缺少的工作,本人测试实现一个很简单的功能:
1、jboss容器发布java代码(不考虑配置文件更新)
1)关闭服务;
2)拷贝代码至指定目录;
3)启动服务;
2、服务器上面开好几个jboss实例(按业务模块化),自动识别出每个容器(目录:/data/)
3、根据模块化发布版本,每次只更新一个业务模块版本
#!/bin/bash
#######################################################
# $Name: release.sh
# $Version: v1.0
# $Function: release for jboss Script
# $Author: Verrion Jian
# $Create Date: 2016-09-22
# $Description: Sub module to release for firm
#######################################################
# 定义脚本环境变量
SHELL_NAME="release.sh"
SHELL_DIR="/data/scripts"
SHELL_LOG="${SHELL_DIR}/${SHELL_NAME}.log"
LOCK_FILE="/tmp/${SHELL_NAME}.lock"
PACKAGE_DIR="/data/code"
# 记录日志
log_output(){
LOG_INFO=$1
echo "$(date "+%Y-%m-%d") $(date "+%H-%M-%S") : ${SHELL_NAME} : ${LOG_INFO}" >> ${SHELL_LOG}
}
# 脚本用法,自动化列出服务器上面存在的所有实例
usage(){
get_modules
str=`echo ${module_array[@]} |sed s/[[:space:]]/'|'/g`
echo $"Usage: $0 [$str]" && exit
}
# 添加锁文件
lock(){
touch ${LOCK_FILE}
}
# 删除锁文件
unlock(){
rm -f ${LOCK_FILE}
}
# 判断代码临时目录和文件是否存在
is_package_exist(){
if [ ! -d $PACKAGE_DIR ];then
log_output "The script exec as insufficient --> The release directory is non-existent"
echo "The release directory is non-existent" && exit
fi
package_num=`ls $PACKAGE_DIR |wc -l`
if [ $package_num -eq 0 ];then
log_output "The script exec as insufficient --> The packages for release is empty"
echo "The packages for release is empty,please check directory:"$PACKAGE_DIR" and upload packages" && exit
fi
}
# 列出服务器上面jboss容器个数
get_container(){
container_name=`ls -l /data/ |grep jboss | awk '{print $9}'|xargs`
}
# 列出实例模块信息,进程号等(如:test_login.war为java代码包)
get_modules(){
get_container
for i in $container_name
do
war_num=`ls /data/$i/server/default/deploy/test*war | wc -l`
if [ $war_num -ne 1 ];then
log_output "The container deploy to not standard--> Num of the war_package can only one"
echo "The container deploy to not standard--> Num of the war_package can only one" && exit
else
war_name=`ls /data/$i/server/default/deploy/test*war | cut -d / -f7 | cut -d - -f1`
pid=`ps -ef |grep $i |grep -v grep |awk '{print $2}'`
module_name=$war_name" "$module_name
pids=$pid" "$pids
jboss_name=$i" "$jboss_name
fi
done
module_array=($module_name)
pid_array=($pids)
jboss_array=($jboss_name)
}
# 模块化发布上线
release_module(){
# ensure a process is running at best
if [ -f "$LOCK_FILE" ];then
log_output "${SHELL_NAME} is running"
echo "${SHELL_NAME}" is running && exit
fi
# ensure the package exist
is_package_exist
# denfie varchar
packagename=$1
packagenum=$2
packagenum=`expr $packagenum - 1`
target_pid=${pid_array[$packagenum]}
target_jboss=${jboss_array[$packagenum]}
target_dir="/data/$target_jboss/server/default/deploy"
package_str=`ls $PACKAGE_DIR`
log_output "release module for platform system start"
lock
if [[ $package_str =~ $packagename ]];then
#kill -9 $target_pid
echo "kill -9 $target_pid"
log_output "kill -9 $target_pid"
#echo $target_pid
sleep 3
#rm -rf $target_dir/$packagename*
echo "rm -rf $target_dir/$packagename*"
log_output "rm -rf $target_dir/$packagename*"
#ls $target_dir/$packagename*
#cp -r $PACKAGE_DIR/$packagename* $target_dir
echo "cp -r $PACKAGE_DIR/$packagename* $target_dir"
log_output "cp -r $PACKAGE_DIR/$packagename* $target_dir"
#ls $PACKAGE_DIR/$packagename*
else
log_output "The package of publish directory is not found"
echo "The package of publish directory is not found" && exit
fi
log_output "release module for platform system stop"
unlock
}
# Main函数入口
main(){
tag=0
if [ -z $1 ];then
usage
fi
get_modules
for i in $module_name
do
let count+=1
if [ $i = $1 ];then
pkgname=$1
pkgnum=$count
release_module "$pkgname" "$pkgnum"
tag=1
break
fi
done
if [ $tag -eq 0 ];then
module_name=""
usage
fi
}
# 执行脚本
main $1
转载于:https://www.cnblogs.com/verrion/p/shellscript_standardized.html
shell脚本规划化模板相关推荐
- Linux shell 脚本结构化命令 if-then
shell 脚本结构化命令 1. if-then 语句基本使用 if-then 语句的基本格式: if command thencommands elifcommands elsecommands f ...
- 运维与自动化系列③自动化部署基础与shell脚本实现
自动化部署基础与shell脚本实现 关于自动化的基础知识: 1.1:当前代码部署的实现方式: 运维纯手工scp到web服务器 纯手工登录git服务器执行git pull或svn服务器执行svn upd ...
- linux脚本 ssh 连接,SSH连接管理 (我的第一个shell脚本)
由于 ssh 链接的服务过多,自己都记不清除 iterm profiles 中的快捷键设置的设置是哪个,于是就产生了一个想法,是不是可以写一个 shell 脚本规划和整理这些内容呢?于是就去查看she ...
- shell脚本编程之更多结构化命令
技术交流QQ群:1027579432,欢迎你的加入! 本教程使用Linux发行版Centos7.0系统,请您注意~ 1.for命令 bash shell提供了for命令,允许你创建一个遍历一系列值的循 ...
- shell脚本-页面静态化
现实需求: 对于一些不是实时性的页面,数据变化也不是很大的页面,我们可以把该JSP或freemark页面进行静态化. 这样的好处,当我们的服务挂掉了,通过nginx的代理,我们依然可以访问相关的页面. ...
- 《Linux命令行与shell脚本编程大全》第十二章 使用结构化命令
许多程序要就对shell脚本中的命令施加一些逻辑控制流程. 结构化命令允许你改变程序执行的顺序.不一定是依次进行的 12.1 使用if-then语句 如下格式: if command then ...
- 扁平化风格职业规划PPT模板
那些人需要职业规划呢?想创业,但不知道自己是否适合创业:在职场中发展不顺利,徘徊不前,当你看不到前途的时候:每天忙碌,但成果有限等,遇到这些问题的时候也是可以进行职业的规划.要职业规划就少不了PPT模 ...
- Shell脚本编程基础 三 使用结构化命令
结构化命令允许我们改变程序执行的顺序,在某些条件下执行一些命令而在其他条件下跳过另一些命令. (1)使用if-then语句 结构化命令中,最基本的类型就是if-then语句,其格式如下: if com ...
- HIVE的shell脚本模板
参照模板 实现了一个等值join的简单Demo 重要得脚本 模板 值得参考 #!/bin/bash # ================================================ ...
最新文章
- 解密FFmpeg播放track mode控制
- Json 不同语言的使用
- 启动任务管理器命令符,doc命令
- 你是不是在混日子,看着一点就知道了
- flowable DMN部署单独使用_06
- Linux添加新硬盘-挂载硬盘,设置开机自动挂载 解决/home 空间不足问题
- 歪批IT系列之“伪热门”人才
- JQuery中serialize()、serializeArray()和param()方法示例介绍
- 关于阵列卡的配置参数Cache Policy(缓存策略)
- 求大于3的素数c语言,c语言判断一个大于3的数是否是素数
- win下的一款自动远程备份工具
- 观《怎样成为一个高手》后感
- 关于集异璧实验室(Geblab)
- 中国十大徒步路线,你走过几个?_我是亲民_新浪博客
- Docker错误合集
- 英国内政部(Home Office)间谍机构(spy powers)假装它是Ofcom咨询中的一名私人公民1514378282474...
- java 服务自启动
- 使用deno和oak开发的短链系统2.0
- ASO商店优化为什么成为必争之地,其优势有哪些?
- 使用cocoscreator接入google AdSence广告
热门文章
- DLL回调EXE里的函数
- 机器学习是什么——周志华
- 用Python编写博客导出工具
- Codeforces Round #506 (Div. 3) - D. Concatenated Multiples(思维)
- ubuntu中的日志文件位置,用于错误查找
- 浅析C++中的this指针 通过空指针(NULL)可以正确调用一些类的成员函数?
- linux5.5 dvd安装教程,linux 5.5 yum的安装方法(ftp)
- php substr的用法,php substr(函数用法)
- linux文件解压zip文件,linux下解压zip文件报错
- 5G NR中的两套绝对频域位置:GSCN和ARFCN