专栏首页FunTester使用Groovy进行Bash(shell)操作

使用Groovy进行Bash(shell)操作

最近,我需要创建一个Groovy脚本来删除Linux机器中的某些目录。原因如下:

  1. 我们有一台服务器来执行预定的作业。从一个数据库到另一个数据库的ETL之类的工作,从文件到数据库的工作,等等。服务器激活客户端,这些客户端位于我们要对其执行操作的机器中。大多数(几乎所有)作业都是用普通脚本编写的。
  2. CI流程的一部分是将WAR部署到专用服务器中。然后,我们有了一个脚本,该脚本除其他外还使用软链接将“ webapps”定向到新创建的目录。该部署每小时进行一次,这将很快填满专用服务器。 因此,我需要创建一个脚本来检查正确位置中的所有目录并删除旧目录。我决定保留最新的4个目录。当前是脚本中的可变数字。如果我想要/需要,可以将其作为输入参数。但是我决定从简单开始。

我决定做的很简单:

在已知位置列出所有前缀为webapp的目录

按时间,降序对它们进行排序,从第四个索引开始执行删除操作。

 1def numberOfDirectoriesToKeep = 4
 2def webappsDir = new File('/usr/local/tomcat/tomcat_aps')
 3def webDirectories = webappsDir.listFiles().grep(~/.*webapps_.*/)
 4def numberOfWeappsDirectories = webDirectories.size();
 5
 6if (numberOfWeappsDirectories >= numberOfDirectoriesToKeep) {
 7  webDirectories.sort{it.lastModified() }.reverse()[numberOfDirectoriesToKeep..numberOfWeappsDirectories-1].each {
 8    logger.info("Deleteing ${it}");
 9    // here we'll delete the file. First try was doing a Java/groovy command of deleting directories
10  }
11} else {
12  logger.info("Too few web directories")
13}
14

没用!!!文件未删除。 碰巧代理程序以与运行tomcat的用户不同的身份运行。该代理无权删除目录。

我的解决方案是使用运行shell命令sudo。

长话短说,这是完整的脚本:

 1import org.slf4j.Logger
 2import com.my.ProcessingJobResult
 3
 4def Logger logger = jobLogger
 5//ProcessingJobResult is proprietary 
 6def ProcessingJobResult result = jobResult
 7
 8try {
 9    logger.info("Deleting old webapps from CI - START")
10    def numberOfDirectoriesToKeep = 4 // Can be externalized to input parameter
11    def webappsDir = new File('/usr/local/tomcat/tomcat_aps')
12    def webDirectories = webappsDir.listFiles().grep(~/.*webapps_.*/)
13    def numberOfWeappsDirectories = webDirectories.size();
14
15    if (numberOfWeappsDirectories >= numberOfDirectoriesToKeep) {
16        webDirectories.sort{it.lastModified() }.reverse()[numberOfDirectoriesToKeep..numberOfWeappsDirectories-1].each {
17            logger.info("Deleteing ${it}");
18            def deleteCommand = "sudo -u tomcat rm -rf " + it.toString();
19            deleteCommand.execute();
20        }
21    } else {
22        logger.info("Too few web directories")
23    }
24    result.status = Boolean.TRUE
25    result.resultDescription = "Deleting old webapps from CI ended"
26    logger.info("Deleting old webapps from CI - DONE")
27} catch (Exception e) {
28    logger.error(e.message, e)
29    result.status = Boolean.FALSE
30    result.resultError = e.message
31}
32
33return result

顺便说一句,有一个较小的索引错误,由于我们总是有更多目录,所以我决定不修复。

本文分享自微信公众号 - FunTester(NuclearTester),作者:八音弦

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-10-10

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Groovy单元测试框架spock数据驱动Demo

    上次文章分享了spock框架的基础功能的使用,在此基础上,我根据自己写的Groovy的封装方法、数据驱动以及一些Groovy的高级语法做了一些尝试。发现还是有一...

    FunTester
  • Groovy重载操作符(终极版)

    最近在研究JSonpath在接口验证和接口串联之间的应用,目前进度尚可,已经在语法封装上有了一个思路。借助Groovy重载操作符的特性,适配一部分类似于=、>、...

    FunTester
  • 电子书网站爬虫实践

    近期搜电子是的时候发现一个有趣的网站,很多精校版的电子书,由于好奇,就想做一个爬虫把名称汇总一下。(具体原因在于canvas的页面背景效果在Chrome浏览器里...

    FunTester
  • Pandas中groupby的这些用法你都知道吗?

    pandas作为Python数据分析的瑞士军刀,集成了大量实用的功能接口,基本可以实现数据分析一站式处理。前期,笔者完成了一篇pandas系统入门教程,也针对几...

    luanhz
  • Go进阶07:错误处理(一)

    在 Go 语言中,如果一个函数或者方法需要返回任何错误,通常会使用 error 接口类型作为返回类型。在标准库中,所有返回了错误信息的函数和方法使用的都是这个接...

    mojocn
  • java连接Mysql8

    DriverManager.registerDriver(new com.mysql.cj.jdbc.Driver());

    我是十三
  • 库克惊人言论或“气活”乔布斯,竟公开承认iPhone售价过高

    镁客网
  • 【许晓笛】支持Touch ID!EOS 项目进展速报

    Daniel Larimer 周六在 Steemit 上向大家介绍了 EOS 项目的最新进展,惊喜不少。

    圆方圆学院
  • 作为一名程序员,谁没跳过槽,“6”招让你“空降”大厂

    转载自:https://blog.csdn.net/Java__xiaoze/article/details/96878759

    Java编程指南
  • CSS魔法堂:小结一下Box Model与Positioning Scheme

    前言  对于Box Model和Positioning Scheme中3种定位模式的细节,已经通过以下几篇文章记录了我对其的理解和思考。 《CSS魔法堂:重新...

    ^_^肥仔John

扫码关注云+社区

领取腾讯云代金券