执行linux命令清理服务器缓存并返回结果怎么实现
这篇文章主要讲解了“执行linux命令清理服务器缓存并返回结果怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“执行linux命令清理服务器缓存并返回结果怎么实现”吧!
1、准备环境 idea spingboot 2.0
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.3.2</version> </dependency> <dependency> <groupId>ch.ethz.ganymed</groupId> <artifactId>ganymed-ssh3</artifactId> <version>build210</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency></dependencies>
2.创建Boot启动类
@SpringBootApplication // 开启定时任务 @EnableSchedulingpublic class SshtimedtaskApplication {public static void main(String[] args) { SpringApplication.run(SshtimedtaskApplication.class, args); } }
3、创建逻辑类
目录结构化
根据spring ioc将定时任务注入容器,启动即开启
@Component@Slf4jpublic class TimedTaskConfig { @Resource TimedTaskService timedTaskService; //“0 15 10 ? * *” 测试 每天上午10:15触发成功 @Scheduled(cron="0 0 23 * * ?") //每晚凌晨 23点触发 public void clearLinuxProcess(){ log.info("获取远程服务器进程号开始:"+new Date()); String proceStr=timedTaskService.execGrepResult();// String pro[]=proceStr.split(" "); log.info("执行远程服务器结束掉进程 kill -9 "+proceStr); timedTaskService.execKileProcess(proceStr); } }
TimedTaskService 定时任务 逻辑类
@Slf4j@Servicepublic class TimedTaskService { // ps -ef | grep xxx.log | grep -v grep | awk '{print $2}' 查询服务器上某个进程的进程号 这个我的是一个推送流的进程号 private static final String execFindGrep="ps -aux|grep rtsp_transport | grep -v grep | awk '{print $2}'"; private static final String killProcess="kill -9 "; public String execGrepResult(){ log.info("准备执行命令:"+execFindGrep); return ScpSshConnectionClient.execute(execFindGrep);// 查询返回的进程号 } public void execKileProcess(String cmd){ log.info("准备执行命令:"+killProcess+cmd); ScpSshConnectionClient.execute(killProcess+cmd);// 这里批量处理 } }
ssh连接服务器
/** * ClassName:ScpSshConnectionClient <br/> * Function: TODO ADD java操作 实现scp上传和下载文件. <br/> * Reason: TODO ADD 服务器相关. <br/> * Date: 2020年8月28日 上午9:55:43 <br/> * @author wangmeng * @version * @since JDK 1.8 * @see */@Slf4jpublic class ScpSshConnectionClient { private static final String IP="172.XXXXXXXX";// 远程服务器地址 private static final String USR="XXXX";// 远程服务器用户名 private static final String PSWORD="XXXXXXXX"; // 远程服务器密码 private static String DEFAULTCHART="UTF-8"; private static Connection connection = new Connection(IP);// 创建对象 /** * * login:ssh用户登录验证,使用用户名和密码来认证. <br/> * @author wangmeng * @return boolean * @since JDK 1.8 */ public static boolean login(){ //创建远程连接,默认连接端口为22,如果不使用默认,可以使用方法 try { connection.connect(); //使用用户名和密码登录 有秘钥可以使用authenticateWithPublicKey验证 return connection.authenticateWithPassword(USR,PSWORD); } catch (IOException e) { log.error("用户%s密码%s登录服务器%s失败!",USR,PSWORD,IP,e); } return false; } /** * 远程执行shll脚本或者命令 * @param cmd * 即将执行的命令 * @return * 命令执行完后返回的结果值 */ public static String execute(String cmd){ String result=""; try { boolean isAuthed =login(); if(isAuthed && connection !=null){ Session session= connection.openSession();//打开一个会话 session.execCommand(cmd);//执行命令 result=processStdout(session.getStdout(),DEFAULTCHART); //如果为得到标准输出为空,说明脚本执行出错了 if(StringUtils.isBlank(result)){log.info("得到标准输出为空,链接connection:"+connection+",执行的命令:"+cmd); result=processStdout(session.getStderr(),DEFAULTCHART); }else{log.info("执行命令成功,链接connection:"+connection+",执行的命令:"+cmd); }connection.close(); session.close(); } } catch (IOException e) {log.error("执行命令失败,链接connection:"+connection+",执行的命令:"+cmd+" "+e.getMessage()); e.printStackTrace(); }return result; }/** * 解析脚本执行返回的结果集 * @param in 输入流对象 * @param charset 编码 * @return * 以纯文本的格式返回 */ private static String processStdout(InputStream in, String charset){ InputStream stdout = new StreamGobbler(in); StringBuffer buffer = new StringBuffer();; try { BufferedReader br = new BufferedReader(new InputStreamReader(stdout,charset)); String line=null; while((line=br.readLine()) != null){ buffer.append(line+" "); } } catch (UnsupportedEncodingException e) {log.error("解析脚本出错:"+e.getMessage()); e.printStackTrace(); } catch (IOException e) {log.error("解析脚本出错:"+e.getMessage()); e.printStackTrace(); }return buffer.toString(); } }
感谢各位的阅读,以上就是“执行linux命令清理服务器缓存并返回结果怎么实现”的内容了,经过本文的学习后,相信大家对执行linux命令清理服务器缓存并返回结果怎么实现这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是蜗牛博客,小编将为大家推送更多相关知识点的文章,欢迎关注!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:niceseo99@gmail.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。版权声明:如无特殊标注,文章均为本站原创,转载时请以链接形式注明文章出处。
评论