在实际工作中小编遇到了一个问题那就是当我去操作部署脚本的时候,另一个人也可以操作,这怎么能行啊,后来小编就觉得重新优化下代码,给它加一个进程锁

老规矩,先梳理下思路:

 同一时间内,脚本只能够允许一个人来操作,那么也就是说

 只要脚本执行就创建一个文件,只要存在这个文件,那么就让脚本退出,同时提示“脚本真在运行中”,脚本执行完毕,就删除创建的文件

 代码如下

  

  1.  #!/bin/bash
  2. # 功能:打包代码
  3. # 名称:deploy.sh
  4. # 作者:灰度
  5. # 版本:0.4
  6. # 联系方式:xxxxx
  7. # 日志功能
  8. write_log(){
  9. LOG_DATE=`date +%F`
  10. LOG_TIME=`date +%T`
  11. buzhou="$1"
  12. echo " ${LOG_DATE}  ${LOG_TIME} $0${buzhou}" >> /data/logs/deploy.log
  13. }
  14. # 增加锁文件
  15. add_lock(){
  16. echo "增加锁文件"
  17. touch /tmp/deploy.pid
  18. write_log "增加锁文件"
  19. }
  20. # 删除锁文件
  21. del_lock(){
  22. echo "删除锁文件"
  23. rm -f /tmp/deploy.pid
  24. write_log "删除锁文件"
  25. }
  26. # 打包代码
  27. tar_code(){
  28. echo "打包代码"
  29. ssh root@192.168.56.12 "/bin/bash /data/scripts/code_tar.sh"
  30. write_log "打包代码"
  31. }
  32. # 传输代码
  33. scp_code(){
  34. echo "传输代码"
  35. cd /data/codes/
  36. [ -f django.tar.gz ] && rm -f django.tar.gz
  37. [ -d django ] && rm -rf django
  38. scp root@192.168.56.12:/data/code/django.tar.gz ./
  39. write_log "传输代码"
  40. }
  41. # 关闭应用
  42. serv_stop(){
  43. echo "关闭nginx应用"
  44. /data/server/nginx/sbin/nginx -s stop
  45. write_log "关闭nginx应用"
  46. echo "关闭django应用"
  47. django_pid=$(lsof -Pti :8000)
  48. kill "${django_pid}"
  49. write_log "关闭django应用"
  50. }
  51. # 解压代码
  52. untar_code(){
  53. echo "解压代码"
  54. cd /data/codes/
  55. tar xf django.tar.gz
  56. write_log "解压代码"
  57. }
  58. # 放置代码
  59. fangzhi_code(){
  60. echo "备份原文件"
  61. B_TIME=$(date +%Y%m%d%H%M%S)
  62. mv /data/server/itcast/test1/views.py /data/backup/views.py-"${B_TIME}"
  63. write_log "备份原文件"
  64. echo "放置新文件"
  65. mv /data/codes/django/views.py  /data/server/itcast/test1/
  66. write_log "放置新文件"
  67. }
  68. # 开启应用
  69. serv_star(){
  70. echo "开启django应用"
  71. source /data/virtual/venv/bin/activate
  72. cd /data/server/itcast/
  73. python manage.py runserver >>/dev/null 2>&1 &
  74. deactivate
  75. write_log "开启django应用"
  76. echo "开启nginx应用"
  77. /data/server/nginx/sbin/nginx
  78. write_log "开启nginx应用"
  79. }
  80. # 检查
  81. check(){
  82. echo "检查部署效果"
  83. netstat -tnulp | grep ':80'
  84. write_log "检查部署效果"
  85. }
  86. main(){
  87. if [ -f /tmp/deploy.pid ]
  88. then
  89. echo "$0 脚本正在执行中..."
  90. exit
  91. else
  92. add_lock
  93. tar_code
  94. scp_code
  95. serv_stop
  96. untar_code
  97. fangzhi_code
  98. serv_star
  99. check
  100. del_lock
  101. fi
  102. }
  103. main

shell编程-项目部署(优化篇)的更多相关文章

  1. 利用shell编程,部署项目到服务器

    现在在前后端分离的开发形式中,每次前端将VUE项目打包之后,需要后端程序员部署到服务器上.这过程为何没有用git,因为每次vue打包后的文件都不相同与前一次打包,git为何的话,会包含过大迭代版本,同 ...

  2. shell编程小技巧(命令篇)

    本文主要介绍shell编程中一些好用的命令或者一些常见命令但比较少用却又好用的参数,目的是希望可以提高编码效率. df命令 常用命令 df / df -k / df -m / df -H / df - ...

  3. 【Eclipse】web项目部署新手篇

    本文属于新手篇章,记录了Eclipse中部署web项目的步骤 1 . 添加Tomcat服务器 右键项目属性-->Run as-->Run on server弹出以下界面 点击finish之 ...

  4. Shell编程学习---第五篇:Shell的输入和输出

    在shell脚本中,可以用几种不同的方式读入数据:可以使用标准输入—缺省为键盘,或 者指定一个文件作为输入.对于输出也是一样:如果不指定某个文件作为输出,标准输出总 是和终端屏幕相关联.如果所使用命令 ...

  5. Shell编程-条件测试 | 基础篇

    什么是Shell Shell是一个命令解释器,它会解释并执行命令行提示符下输入的命令.除此之外,Shell还有另一个功能,如果要执行多条命令,它可以将这组命令存放在一个文件中,然后可以像执行Linux ...

  6. Shell编程-项目部署(一)

    由于实际工作中经常用到需要部署项目,比较麻烦,今天记录下如何利用shell脚本完成自动部署的工作,毕竟不是专业的运维出身,写的不好,还请勿喷_^o^_ 今天以部署Django项目为演示,进行部署项目, ...

  7. shell编程-项目部署(二)

    上节我们讲了项目部署的准备工作,现在具体讲下代码部署 首先梳理下思路,大致是这样: 获取代码 打包代码 传输代码 关闭应用 解压文件 放置文件(备份老文件,放置新的文件) 开启应用 最后检查下 OK, ...

  8. 服务器小白的我,是如何将 node+mongodb 项目部署在服务器上并进行性能优化的

    前言 本文讲解的是:做为前端开发人员,对服务器的了解还是小白的我,是如何一步步将 node+mongodb 项目部署在阿里云 centos 7.3 的服务器上,并进行性能优化,达到页面 1 秒内看到 ...

  9. 【转】Shell编程基础篇-上

    [转]Shell编程基础篇-上 1.1 前言 1.1.1 为什么学Shell Shell脚本语言是实现Linux/UNIX系统管理及自动化运维所必备的重要工具, Linux/UNIX系统的底层及基础应 ...

  10. 部署基于Gitlab+Docker+Rancher+Harbor的前端项目这一篇就够了

    部署基于Gitlab+Docker+Rancher+Harbor的前端项目这一篇就够了 安大虎 ​ momenta 中台开发工程师 6 人赞同了该文章 就目前的形势看,一家公司的运维体系不承载在 Do ...

随机推荐

  1. 想不到的:js中加号操作符

    研究js加号操作符的时候,无意中试验了一个 console.log({} + "str");//NaN 发现结果居然是NaN,这让我百思不得其解. 我查阅资料,js高级编程里是这样 ...

  2. Django—urls系统:urls基础

    Django的urls系统简介 Django 1.11版本 URLConf官方文档 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映 ...

  3. 201621123060《JAVA程序设计》第十三周学习总结

    1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 2. 为你的系统增加网络功能(购物车.图书馆管理.斗地主等)-分组完成 为了让你的系统可以被多个用户通过网 ...

  4. android批量打包

    http://blog.csdn.net/johnny901114/article/details/48714849

  5. 2017 清北济南考前刷题Day 3 morning

    实际得分:100+0+0=100 T1 右上角是必败态,然后推下去 发现同行全是必胜态或全是必败态,不同行必胜必败交叉 列同行 所以n,m 只要有一个是偶数,先手必胜 #include<cstd ...

  6. webpack你值得拥有-从四个核心配置谈起

    很久没有发文章了,但是强调一点,大-熊同学最近可没闲着.学习算法,复习计算机网络,也顺便学习了一下webpack,看了看操作系统(没办法,都没学,要是不学连实习笔试都过不了,伤心--).本来比较纠结是 ...

  7. ssh整合之五struts和spring整合

    1.首先,我们需要先分析一下,我们的spring容器在web环境中,只需要一份就可以了 另外,就是我们的spring容器,要在我们tomcat启动的时候就创建好了(包括其中的spring的对象),怎么 ...

  8. java专业术语

    java的(PO,VO,TO,BO,DAO,POJO)解释 PO(persistant object) 持久对象 在o/r映射的时候出现的概念,如果没有o/r映射,没有这个概念存在了.通常对应数据模型 ...

  9. centos7搭建nexus maven私服(二)

    本文主要补充两个主题: 1.手动更新索引 2.通过maven客户端发布本地jar包到nexus 先说第一个主题: 由于maven中央仓库汇集了全世界绝大多数的组件,所以它的索引库非常庞大,在我们右击仓 ...

  10. mybatis配置多数据源(利用spring的AbstractRoutingDataSource)

    主要是利用了spring的AbstractRoutingDataSource. 直接上配置了: spring-mybatis.xml <bean name="dataSource&qu ...