DarkTime
  • README
  • SpringBoot
    • spring boot 运维
    • Spring Boot 部署war包
    • springboot搭建
    • spring boot 读取配置文件
    • 简单总结
    • spring配置文件
    • spring boot Configuration
    • spring boot 配置文件
    • spring boot 配置mybatis
  • MacAwesome
    • markdown使用
    • MAC APP Awesome
    • [markdown使用](/MacAwesome/SUMMARY.md)
    • chrome
    • intellij idea
    • MacAwesome
    • VS Code 的使用
    • MAC Shell命令
  • database
    • druid使用
  • 框架
    • 项目拆析
    • 各种框架和工具
  • docker
    • kubernetes
    • docker
    • docker 常用镜像
  • 效率工具
    • 解决dns污染导致域名解析失败
    • sonarqube 相关配置
    • Iterm2 使用
    • gitbook
    • github awesome github资源推荐
    • playground 在线试用平台汇总
    • linux中的office
    • linux screen 工具
    • 简单Mock服务(moco)
    • npm
    • Visual Studio Code 的使用
    • 配置开发环境
    • homebrew的使用
    • 汇总
  • tomcat
    • tomcat目录规范
  • code_snippets
  • 专题
    • RESTful API
    • serveless服务
    • 搭建私有云主机 折腾记
    • 开发中的各种疑难杂症问题
    • spring 最佳实践
    • LLM 大语言模型
    • notelive
      • 文章框架
      • notelive vue版本开发
      • notelive 开发 札记
    • webrtc技术分析
    • 反向代理
    • spring-cloud
      • spring boot admin 监控服务
      • Spring Cloud 整理汇总
  • python
    • python 学习
    • Python 修饰器的一些小细节
  • 云主机
    • aliyun 主机的种种
  • maven
    • maven使用
    • maven项目增加编译版本号 buildnumber-maven-plugin
    • 仓库
  • java
    • java 开发常用工具类
    • java
    • apache commons pool 对象连接池
  • 大数据
    • kafka
    • gobblin
    • sqoop 简介及使用
    • hbase
    • gobblin
    • sqoop源码解析
    • hadoop map reduce
    • 大数据 学习札记
  • 脚本
    • python
      • 批量请求url 解析json数据
    • js
      • sheetjs-js读取excel
    • shell
      • 自动生成bitbook的summary文件
      • linux/mac 实用脚本
      • 自动创建tomcat项目脚本
      • 批量处理文件内容脚本
  • nginx
    • nginx
    • ngix 文件浏览器 文件服务器
  • linux
    • 群晖nas札记
    • ftp
    • linux 运维
    • 常用命令
    • linux
    • mysqldump脚本
    • 代理
    • 简易灰度部署脚本 不使用jenkins的纯shell方式
    • shell脚本
    • 附加文档
  • mysql
    • sql
  • 游戏开发
    • Unity 2020 学习笔记
  • 学习笔记
    • centos常用环境安装
    • gradle 学习
    • 建站经历
    • python
      • 爬虫教程
    • 如何解决百度爬虫无法爬取搭建在Github上的个人博客的问题? - 知乎
    • baas
      • 在本地部署Parse Server
    • mysql学习标记
    • java code snippets
    • 非Spring Boot Web项目 注册节点到Eureka Server并提供服务
    • kotlin
      • Kotlin 学习札记
    • spring cloud
    • vim配置
    • 前端
      • 开发PWA应用
  • jenkins
    • jenkins配置备份
    • gitlab触发Jenkins 自动构建
    • 安装与使用
  • npm
    • npm 使用
  • git
    • ignore
    • git使用总结
    • git配置多个远程仓库
  • 前端
    • swig
    • 解决跨域请求问题
    • angularjs 学习
    • scriptbot的前端开发经验总结
    • 各种资源
    • 一些有用的js代码
Powered by GitBook
On this page
  • 一些特性
  • shell中对参数的处理
  • 防止脚本同时运行多个 防止脚本多开

Was this helpful?

  1. linux

shell脚本

Previous简易灰度部署脚本 不使用jenkins的纯shell方式Next附加文档

Last updated 5 years ago

Was this helpful?

编写shell脚本的参考例子:

一些特性

sh脚本可以直接放到/usr/local/bin等bin目录下去作为命令工具直接使用

$ vim /usr/local/bin/demo
#文件内容
#!/bin/bash
echo 123

$ chmod +x /usr/local/bin/demo #加权限

$ demo #执行命令
123

linux一行命令中可以指定环境变量给要执行的命令,如

$ cat demo.sh
echo $ENV1
echo $ENV2

$ ENV1=a ENV2=b sh demo.sh
a
b

shell中对参数的处理

#echo -n "$1"|md5sum|awk '{print $1}'|xargs -I{} kubectl -n {} $2 $3 $4 $5 $6 $7
id=`echo -n "$1"|md5sum|awk '{print $1}'`
if [ -z $2 ];then
echo $id
exit 0
fi
kubectl -n $id ${@:2}
# ${@:2} 会返回第二个开始的所有参数,参考: https://www.jianshu.com/p/eaa3406b7cff
# 示例: ${@:1:$#-1} : 其中$@是列表形式列出所有的传入参数,然后:1是从第一个参数开始,后面不加任何东西的话是一直到结尾,而加:$#-1是$#是参数总个数-1,即显示除去最后一个参数外的所有参数。
while getopts a:n:f:h FLAG; do
  case $FLAG in
    a)  #set option "a"
      action="$OPTARG"
      echo "$action start!"
      ;;
    n)  #set option "n"
      namespace="$OPTARG"
      echo "namespace = $namespace"
      ;;
    f)  #set option "f"
      valuesOption="$OPTARG"
      echo "valuesOption = $valuesOption"
      ;;
    h)  #show help
      HELP
      ;;
    \?) #unrecognized option - show help
      echo -e \\n"Option -${BOLD}$OPTARG${NORM} not allowed."
      HELP
      ;;
  esac
done

防止脚本同时运行多个 防止脚本多开

比如说有一个周期性(cron)备份mysql的脚本,或者rsync脚本,

如果出现意外,运行时间过长, 很有可能下一个备份周期已经开始了,当前周期的脚本却还没有运行完, 显然我们都不愿意看到这样的情况发生。

其实只要对脚本自身做一些改动,就可以避免它被重复运行。

#!/bin/bash

LOCK_NAME="/tmp/my.lock"
if [[ -e $LOCK_NAME ]] ; then
echo "re-entry, exiting"
exit 1
fi

### Placing lock file
touch $LOCK_NAME
echo -n "Started..."

### 开始正常流程
### 正常流程结束

### Removing lock
rm -f $LOCK_NAME

echo "Done."

当脚本开始运行时, 创建 /tmp/my.lock文件, 这时如果再次运行此脚本,发现存在my.lock,就退出, 脚本运行结束时删除这个文件。

大多数情况下,这样做都没有什么问题。 意外1) 如果同时运行二次此脚本, 二个进程都会发现my.lock不存在,然后都可以继续执行。 意外2) 如果脚本在运行过程中意外退出, 没有来得及删除 my.lock文件, 那么就悲剧了。

修改如下:

#!/bin/bash

LOCK_NAME="/tmp/my.lock"
if ( set -o noclobber; echo "$$" > "$LOCK_NAME") 2> /dev/null; 
then
trap 'rm -f "$LOCK_NAME"; exit $?' INT TERM EXIT

### 开始正常流程
### 正常流程结束

### Removing lock
rm -f $LOCK_NAME
trap - INT TERM EXIT
else
echo "Failed to acquire lockfile: $LOCK_NAME." 
echo "Held by $(cat $LOCK_NAME)"
exit 1
fi



echo "Done."

set -o noclobber 的意思:

If set, bash does not overwrite an existing file with the >, >&, and <> redirection operators.

这样就能保证my.lock只能被一个进程创建出来。比touch靠谱多了。

trap 可以捕获各种信号,然后做出处理: INT 用来处理 ctrl+c取消脚本执行的情况。 TERM 用来处理 kill -TERM pid 的情况。 EXIT 不清楚

另外,对于 kill -9 无效。。

还记得N年前,在php群里面,草人也问过这个问题, 我们给的答案是 ps aux|grep filename |wc -l ,哈哈,真2。

如何避免shell脚本被同时运行多次 转自:

shell脚本
一些特性
shell中对参数的处理
防止脚本同时运行多个 防止脚本多开
ClassicOldSong/shadow
演示
http://www.etwiki.cn/linux/2786.html