首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >使用Groovy进行Bash(shell)操作

使用Groovy进行Bash(shell)操作

作者头像
FunTester
发布于 2019-10-13 14:47:47
发布于 2019-10-13 14:47:47
2.2K00
代码可运行
举报
文章被收录于专栏:FunTesterFunTester
运行总次数:0
代码可运行

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

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

我决定做的很简单:

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 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。

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 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

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-10-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 FunTester 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
手把手带你秒杀架构实践(含完整代码)
之前在 Java-Interview 中提到过秒杀架构的设计,这次基于其中的理论简单实现了一下。
java进阶架构师
2018/12/18
1.2K0
SSM(十六) 曲线救国-Kafka消费异常
最近线上遇到一个问题:在消费 kafka消息的时候如果长时间( 大概半天到一天的时间)队列里没有消息就可能再也消费不了。针对这个问题我们反复调试多次。线下模拟,调整代码,但貌似还是没有找到原因。但是只要重启消费进程就又可以继续消费。
crossoverJie
2022/08/19
2740
SSM(十六) 曲线救国-Kafka消费异常
聊聊如何实现动态加载spring拦截器
之前写过一篇文章聊聊如何实现热插拔AOP,今天我们继续整一个类似的话题,聊聊如何实现spring拦截器的动态加载
lyb-geek
2024/01/16
2580
聊聊如何实现动态加载spring拦截器
JAVA安全之Groovy命令注入刨析
Groovy是一种基于Java平台的动态语言,其设计目标是为Java开发者提供一种更简洁、高效和灵活的方式来编写代码,它与Java语言具有良好的兼容性,允许开发者在Java项目中无缝使用Groovy代码,具有简洁的语法和强大的功能可以用于脚本编写、自动化以及构建工具等多个场景,Groovy提供了与Java互操作的能力并且可以轻松地执行命令行命令,很多JAVA项目中都会使用Groovy来动态执行命令而未进行任何校验从而导致RCE,本篇文章主要是填之前迟迟没去系统性归纳Groovy所挖的坑~
Al1ex
2024/12/09
1K0
JAVA安全之Groovy命令注入刨析
JsonPath验证类既Groovy重载操作符实践
在使用?JsonPath工具类封装进行接口响应的验证过程中,由于使用原生的JsonPath的API获取到的值默认是object,如果需要转成其他类型需要多写一些代码。 这一点对于将要提供给前端的工具类
FunTester
2020/09/27
6760
Docker下HBase学习,三部曲之三:java开发
摘要总结:本文主要介绍了如何在Java应用中操作HBase进行增删改查操作。主要包括了HBase的部署、HBase表的设计、HBase API的封装和调用、HBase的整合Spring Boot以及基于HBase的分布式事务等。同时,还通过一个具体的示例展示了如何在Spring Boot项目中整合HBase和Spring Data JPA,实现基于HBase的数据库操作功能。
程序员欣宸
2018/01/04
1.2K0
Docker下HBase学习,三部曲之三:java开发
Java&Groovy下载文件对比
最近工作有个上传和下载的相关的测试,所以就写了一个下载文件(目前都是图片)的方法。Java不过瘾,顺手也找了一下Groovy的下载文件方法。
FunTester
2021/03/11
7830
Groovy重载操作符(终极版)
最近在研究JSonpath在接口验证和接口串联之间的应用,目前进度尚可,已经在语法封装上有了一个思路。借助Groovy重载操作符的特性,适配一部分类似于=、>、>=和classType这样的验证功能,重新翻起来了《Groovy in action》这本神书,重新复习了一下,再看看自己之前写过的Groovy重载操作符,有点对不住读者。
FunTester
2020/08/27
5860
Lucene初步学习及在博客系统中应用demo
现在很流行的Solr和Elasticsearch,都是基于Lucene开发的.此外,Eclipse的帮助系统的搜索也是基于Lucene实现的.
呼延十
2019/06/26
8670
Lucene初步学习及在博客系统中应用demo
聊聊如何实现动态加载spring拦截器
注: 核心点是利用MappedInterceptor bean能被AbstractHandlerMapping自动探测
lyb-geek
2024/01/21
2120
聊聊如何实现动态加载spring拦截器
java的 zip 工具类
import java.io.; import java.util.logging.Logger; import java.util.zip.; /** Created by sunyameng on 14-3-10. / public class ZipUtil { private final static Logger logger = Logger.getLogger(ZipUtil.class.getName()); private static final int BUFFER = 1024
用户7108768
2021/09/23
7830
Groovy实现热部署
原文中对于Grovvy实现热更新原理没有进行讲解,并且案例存在问题,可能是因为本人版本与作者不同所致,所以本文会进行原理介绍,并纠正原文错误。
大忽悠爱学习
2023/02/13
9840
Groovy实现热部署
Ngrinder简单安装
https://github.com/naver/ngrinder/releases
高楼Zee
2019/10/24
8960
Ngrinder简单安装
性能工具之Ngrinder源码部署
https://github.com/naver/ngrinder/releases
高楼Zee
2019/10/24
8340
性能工具之Ngrinder源码部署
Java和Groovy正则使用
相信很多人都对正则有很深的交情,毕竟这玩意功能太强了,几乎无处不在。我最长用的正则还是爬虫。爬虫分两类,一种是接口返回json数据的,一种是返回HTML数据的。
FunTester
2020/03/10
1.3K0
Groovy-拾遗
许多以前使用 C++ 的开发人员会怀念操作符重载,例如 + 和 -。虽然它们很方便,但是被覆盖的操作符的多态实质会造成混淆,所以操作符重载在 Java 语言中被取消了。这个限制的好处是清晰:Java 开发人员不必猜想两个对象上的 + 是把它们加在一起还是把一个对象附加到另一个对象上。不好的地方则是丧失了一个有价值的简写形式。
白石
2019/08/23
1.7K0
Groovy、热部署和热加载(自定义类加载器)及spring loaded 部分源码分析
优点:不需要重启tomcat服务器,如果一个tomcat多个项目,不必因为tomcat停止而停止其他的项目。
猎户星座1
2020/08/26
3.5K0
Groovy单元测试框架spock基础功能Demo
最近在做单元测试框架的调研和尝试,目前确定的方案框架包括是:spock,Junit,Mockito以及powermock。由于本身使用Groovy的原因,比较钟情于spock框架,但是奈何兼容性比较差,特别是跟Mockito等框架的高级语法的兼容。不过这不妨碍spock是一个非常优秀的单元测试框架,特别体现在用例的形式和测试报告的展示方式以及报错信息的展示(这个我最中意)。
FunTester
2019/11/14
9370
pinpoint插件开发之一:牛刀小试,调整gson插件
从本章开始我们一起来实战pinpoint插件开发,做一些实用的pinpoint插件,本着先易后难的原则,我们从修改现有插件开始吧; 准备工作 本次实战的操作环境是win10专业版,安装了Docker
程序员欣宸
2018/01/04
1.2K0
pinpoint插件开发之一:牛刀小试,调整gson插件
Java实战操作MongoDB集群(副本集)
程序员欣宸
2018/01/04
2.2K0
Java实战操作MongoDB集群(副本集)
相关推荐
手把手带你秒杀架构实践(含完整代码)
更多 >
交个朋友
加入HAI高性能应用服务器交流群
探索HAI应用新境界 共享实践心得
加入架构与运维学习入门群
系统架构设计入门 运维体系构建指南
加入架构与运维工作实战群
高并发系统设计 运维自动化实践
换一批
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档