当前位置: 首页 > news >正文

java 执行linux 命令

文章目录

  • 前言
  • 一、linux命令执行
  • 二、使用步骤
  • 三、踩坑

前言

java 执行linux 命令;
本文模拟复制linux文件到指定文件夹后打zip包后返回zip名称,提供给下载接口下载zip;

一、linux命令执行

linux命令执行Process process = Runtime.getRuntime().execProcess process = new ProcessBuilder(commands).start();

   /*** 执行Linux命令*/public static void execCommand(String commands) throws IOException {Process process = null;BufferedReader reader = null;try {//创建进程实例执行Linux命令process = Runtime.getRuntime().exec(new String[]{"/bin/sh", "-c", commands});// 获取标准输入流reader = new BufferedReader(new InputStreamReader(process.getInputStream()));String line;while ((line = reader.readLine()) != null) {//log.info("linux----" + line);}// 等待进程结束int exitCode = process.waitFor();if (exitCode != 0) {log.error("执行Linux命令异常,exitCode={},linux command={}", exitCode, commands);throw new BusinessCheckException("执行Linux命令异常");}} catch (IOException | InterruptedException e) {log.error("执行Linux命令异常", e);throw new BusinessCheckException("执行Linux命令异常");} finally {if (reader != null) {reader.close();}if (process != null) {process.destroy();}}}

二、使用步骤

  1. 通过linux命令,打包目标数据到zip
public String downToZip(CorpQrCodeReq req, HttpServletResponse response) {StopWatch sw = new StopWatch();// 参数校验if (CollectionUtils.isEmpty(req.getCorpIds()) || CollectionUtils.isEmpty(req.getCorpNames())) {return "0";}// 生成保存目录文件夹String uuid = UUID.randomUUID().toString().replace("-", "");String baseUploadPath = "/tmp/zip/"+uuid+"/";FileUtil.mkdir(baseUploadPath);try {//生成二维码到临时目录List<String> enterpriseIds = req.getCorpIds();List<String> enterpriseNames = req.getCorpNames();List<String> command = new ArrayList<>(enterpriseIds.size());// 拼接被复制的文件地址for (int i = 0; i < enterpriseIds.size(); i++) {String path = this.qrCode(CorpQrCodeReq.builder().corpIds(Lists.newArrayList(enterpriseIds.get(i))).corpNames(Lists.newArrayList(enterpriseNames.get(i))).build());command.add(path + " ");}sw.stop();log.info(sw.getLastTaskName() + sw.getTotalTimeSeconds() + "s");sw.start("执行cp命令");String property = System.getProperty("line.separator");//拼接shell脚本String sb = " for i in  " + String.join(" ", command) +property +"do" +property +" cp -n  \"$i\" " + baseUploadPath +property +"done";//执行cp命令execCommand(sb);sw.stop();log.info(sw.getLastTaskName() + sw.getTotalTimeSeconds() + "s");sw.start("执行压缩命令");//执行压缩命令 统一压缩比一个一个压缩进去效率高 //-j忽略源文件路径,直接打包目标文件String zipCommand = " /bin/zip -1 -j " + baseUploadPath.concat(".zip") + " " + baseUploadPath + "/*";execCommand(zipCommand);sw.stop();log.info(sw.getLastTaskName() + sw.getTotalTimeSeconds() + "s");log.info(sw.prettyPrint());return uuid;} catch (Exception e) {log.error("压缩包下载失败 ", e);throw new BusinessCheckException("压缩包下载失败");}}
  1. 根据uuid,下载zip文件(2个接口,一个是根据条件生成zip,另一个根据zip名称下载),此处下载应用了nginx的X-Accel-Redirect,具体使用方法参考springboot X-Accel-Redirect 大文件下载实现
    public void downZip(String path, HttpServletResponse response) {try {String baseUploadPath ="/tmp/zip/";response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("企业二维码", StandardCharsets.UTF_8.toString()) + ".zip");//设置URI给nginx进行内部的跳转response.setHeader("X-Accel-Redirect", "/upload" + baseUploadPath.concat(path).concat(".zip"));} catch (Exception e) {log.error(" 二维码压缩包下载失败 ", e);throw new BusinessCheckException("二维码压缩包下载失败");}}

三、踩坑

  1. linux 和 java 2个进程异步问题

linux命令执行后,和java服务是2个进程。
当linux命令执行过程期间,java下面的业务服务已触发时(比如文件数量较大,而下载接口触发较快时)会造成数据不完整(zip包打包不全,一般一个文件没有)。
此时我们需要利用 读取执行流 + process.waitFor(),等待linux进程结束后再做业务处理。

  1. 关于Process初始化
 Process process = null;// 如果commands拼接的命令中包含空格 会自动识别为2段命令process = new ProcessBuilder(commands).start();// 不支持空格和|process = Runtime.getRuntime().exec(commands);// -c 表示cmd是一条命令,不会被截断process = Runtime.getRuntime().exec(new String[]{"/bin/sh", "-c", commands});
  1. linux for cp 空格识别问题
    执行脚本如下:
for i in  "/data/mnt/www/corp-qr/769847/九台区九台中由 生活服务部.jpg"
docp -n  $i  /data/zip/5e0e67f59c524a4e9851abd3a3dfe0ac
done

此时执行命令报错:cp: 无法获取"/data/mnt/www/corp-qr/769847/九台区九台中由" 的文件状态(stat): 没有那个文件或目录 cp: 无法获取"生活服务部.jpg" 的文件状态(stat): 没有那个文件或目录,linux 会将目标文件解析成2个文件。

解决方案:

"/data/mnt/www/corp-qr/769847/九台区九台中由 生活服务部.jpg" 修改为 "/data/mnt/www/corp-qr/769847/*"cp -n  $i  /data/zip/5e0e67f59c524a4e9851abd3a3dfe0ac 修改为 cp -n  "$i"  /data/zip/5e0e67f59c524a4e9851abd3a3dfe0ac
  1. 执行效率优化
    一千个文件测试结果:
    a. 文件循环时直接打包到zip"/bin/zip -rj " + baseUploadPath.concat(".zip") + " " + baseUploadPath + "/*";效率不如cp 到文件夹下压缩文件夹
    b. 调整压缩率 zip -1
    c. 文件循环时直接cp,由于execCommand执行linux命令要等返回结果再执行,所以效率也不高

  2. cp 文件覆盖问题
    同名文件cp linux会提示是否覆盖,如果通过java执行cp,无法给予是否覆盖的回应,报错:没有那个文件或目录,如果忽略覆盖提示?
    覆盖提示原因:
    在这里插入图片描述
    我们执行cp时 实际linux执行的是cp -i -i 表示覆盖前提示

-- 命令前加反斜线忽略alias
\cp /var/tmp/test.txt /tmp 
-- 使用命令全路径
/bin/cp /var/tmp/test.txt /tmp
-- 先取消别名再复制(不推荐)
unalias cp
-- 不覆盖
cp -n /var/tmp/test.txt /tmp

在这里插入图片描述

相关文章:

java 执行linux 命令

文章目录 前言一、linux命令执行二、使用步骤三、踩坑 前言 java 执行linux 命令&#xff1b; 本文模拟复制linux文件到指定文件夹后打zip包后返回zip名称&#xff0c;提供给下载接口下载zip&#xff1b; 一、linux命令执行 linux命令执行Process process Runtime.getRunti…...

ubuntu将本机的wifi网络通过网线分享给另一台机器(用于没有有线网络,重装系统后无wifi驱动或者另一台设备没有wifi网卡)

1.将两台机器通过网线连接 2.在pci ethernet中设置选择另一台机器的mac address&#xff0c;ipv4中选择share to other computer&#xff0c;另一台机器上设置为动态ip&#xff0c;连接上之后另一台机器即可上网。...

Docker + Jenkins + Gitee 自动化部署项目

1.简介 各位看官老爷&#xff0c;本文为Jenkins实战&#xff0c;注重实际过程&#xff0c;阅读完会有以下收获&#xff1a; 了解如何使用Docker安装Jenkins了解如何使用Jenkins部署maven项目了解如何使用JenkinsGitee实现自动化部署 2.Jenkins介绍 相信&#xff0c;正在读这…...

ChatGPT 应用开发(一)ChatGPT OpenAI API 免代理调用方式(通过 Cloudflare 的 AI Gateway)

前言 开发 ChatGPT 应用&#xff0c;我觉得最前置的点就是能使用 ChatGPT API 接口。首先我自己要能成功访问&#xff0c;这没问题&#xff0c;会魔法就可以本地调用。 那用户如何调用到我的应用 API 呢&#xff0c;我的理解是通过用户能访问到的中转服务器向 OpenAI 发起访问…...

【TC3xx】GETH

目录 一、RGMII 二、SMI接口 三、TC3xx MCAL 3.1 MCU 3.2 Port 3.3 DMA 3.4 中断配置 3.5 ETH 3.6 集成 一、RGMII TC3xx支持MII/RMII/RGMII三种以太网数据通信接口。其中RGMII经常用于MAC和MAC之间&#xff0c;或MAC与PHY之间的通信&#xff0c;RGMII的带宽可以是10M…...

不需要联网的ocr项目

地址 GitHub - plantree/ocr-pwa: A simple PWA for OCR, based on Tesseract. 协议 mit 界面 推荐理由 可以离线使用&#xff0c;隐私安全...

【Git使用总结】

Git使用总结 随着软件开发和团队协作的日益重要&#xff0c;Git作为一种强大的版本控制系统&#xff0c;已经成为了开发人员不可或缺的工具。本文将对Git的使用进行总结&#xff0c;以帮助读者更好地掌握Git的用法和技巧。 一、Git的基本概念 在开始使用Git之前&#xff0c;…...

仿照MyBatis手写一个持久层框架学习

首先数据准备&#xff0c;创建MySQL数据库mybatis&#xff0c;创建表并插入数据。 DROP TABLE IF EXISTS user_t; CREATE TABLE user_t ( id INT PRIMARY KEY, username VARCHAR ( 128 ) ); INSERT INTO user_t VALUES(1,Tom); INSERT INTO user_t VALUES(2,Jerry);JDBC API允…...

关东升老师极简系列丛书(由清华大学出版社出版)

极简系列丛书&#xff0c;编程学习新体验 在这个科技日新月异的时代&#xff0c;编程已经成为了一种必备技能。但是面对各种复杂的编程语言&#xff0c;你是否也曾感到过迷茫和困惑&#xff1f;由清华大学出版社出版的“极简系列丛书”就是为了帮助你解决这个问题。 这套丛书…...

要求CHATGPT高质量回答的艺术:提示工程技术的完整指南—第 27 章:如何避开和绕过所有人工智能内容检测器

要求CHATGPT高质量回答的艺术&#xff1a;提示工程技术的完整指南—第 27 章&#xff1a;如何避开和绕过所有人工智能内容检测器 使用高易错性和突发性方法 与人工智能生成的文本相比&#xff0c;人类写作往往具有更多的突发性&#xff0c;这是由于人类往往比人工智能生成的文…...

JavaWeb笔记之MySQL数据库

#Author 流云 #Version 1.0 一、引言 1.1 现有的数据存储方式有哪些&#xff1f; Java程序存储数据&#xff08;变量、对象、数组、集合&#xff09;&#xff0c;数据保存在内存中&#xff0c;属于瞬时状态存储。 文件&#xff08;File&#xff09;存储数据&#xff0c;保存…...

Amazon CodeWhisperer 开箱初体验

文章作者&#xff1a;Coder9527 科技的进步日新月异&#xff0c;正当人工智能发展如火如荼的时候&#xff0c;各大厂商在“解放”码农的道路上不断创造出各种 Coding 利器&#xff0c;今天在下就带大家开箱体验一个 Coding 利器&#xff1a; Amazon CodeWhisperer。 亚马逊云科…...

Java的引用类型有几种?区别是什么?

Java中的引用类型主要分为四种&#xff1a;强引用&#xff08;Strong Reference&#xff09;、软引用&#xff08;Soft Reference&#xff09;、弱引用&#xff08;Weak Reference&#xff09;和虚引用&#xff08;Phantom Reference&#xff09;。这些引用类型在Java中主要用于…...

掌握iText:轻松处理PDF文档-基础篇

关于iText iText是一个强大的PDF处理库&#xff0c;可以用于创建、读取和操作PDF文件。它支持PDF表单、加密和签署等操作&#xff0c;同时支持多种字体和编码。maven的中央仓库中的最新版本是5.X&#xff0c;且iText5不是完全免费的&#xff0c;但是基础能力是免费使用的&…...

小红书民宿文案怎么写?建议收藏

随着民宿市场的日益火爆&#xff0c;如何在众多民宿中脱颖而出&#xff0c;吸引更多租客入住&#xff0c;成为摆在每一位民宿业主面前的难题。一篇优质的小红书民宿文案&#xff0c;不仅能吸引潜在租客的关注&#xff0c;还能提高民宿的知名度。本文伯乐网络传媒将从八个方面教…...

C#教程(一):面向对象

1、介绍 C#是一种多范式编程语言&#xff0c;但其中一个主要的编程范式是面向对象编程&#xff08;OOP&#xff09;。面向对象编程有一些特点&#xff0c;而C#提供了丰富的功能来支持这些特点。 2、面向对象特点 封装&#xff08;Encapsulation&#xff09;&#xff1a; 封装…...

Linux系统中部署minio服务、开启反向代理、二级域名SSL加固

链接: B站1小时-配置指导视频: 一、创建minio 文件目录(/project/minio) 二、下载Minio wget https://dl.min.io/server/minio/release/linux-amd64/minio 三、在minio目录中-创建日志文件 四、对minio(可以理解为windows系统中的.exe可执行文件) 进行授权 chmod 777 min…...

PMP备考总结:项目管理PMP考试提高通过率,轻松上岸~

分享一篇左羊学霸的备考总结&#xff0c;希望能帮到正在备考的友友们~ 前言 作为⼀名通过PMP项⽬管理认证并且拿到3A成绩 ( PMP认证最好成绩) 的 学习者&#xff0c; 来跟⼤家分享下我考取PMP证书的动机与过程 。考证不是主要⽬ 的&#xff0c; 在考证的过程深化⾃⼰的项⽬管理…...

shell脚本中获取当前脚本的绝对路径

说明: PWD 是获取当前脚本的执行路径的&#xff0c;下面的方式是获取文件绝对路径的。 话不多说&#xff0c;直接上硬货!!! #!/bin/bashecho "执行路径 $PWD"absolute_path$(readlink -f "$0") # 获取目录路径 directory$(dirname "$absolute_path&q…...

SSD基础架构与NAND IO并发问题探讨

在我们的日常生活中&#xff0c;我们经常会遇到一些“快如闪电”的事物&#xff1a;比如那场突如其来的雨、那个突然出现在你眼前的前任、还有就是今天我们要聊的——固态硬盘&#xff08;SSD&#xff09;。 如果你是一个技术宅&#xff0c;或者对速度有着近乎偏执的追求&…...

Chord实战效果:一段30秒视频的深度解析,展示其视觉定位与描述能力

Chord实战效果&#xff1a;一段30秒视频的深度解析&#xff0c;展示其视觉定位与描述能力 1. 引言&#xff1a;为什么选择这段30秒视频 今天我要带大家近距离观察Chord视频理解工具的实际表现。不同于传统的技术参数罗列&#xff0c;我们将通过一段精心挑选的30秒视频&#x…...

OpenClaw任务监控方案:Qwen3.5-4B-Claude-4.6-Opus-Reasoning-Distilled-GGUF长链条任务管理技巧

OpenClaw任务监控方案&#xff1a;Qwen3.5-4B-Claude-4.6-Opus-Reasoning-Distilled-GGUF长链条任务管理技巧 1. 为什么需要长链条任务监控 去年冬天&#xff0c;当我第一次用OpenClaw执行一个包含12个步骤的自动化流程时&#xff0c;系统在凌晨3点卡在了第7步——模型因为To…...

HARMONYOS应用实例246:互动七巧板拼图

项目二:互动七巧板拼图 功能介绍: 本应用模拟了中国传统智力玩具七巧板。屏幕上展示7块几何形状(三角形、正方形、平行四边形),支持拖动平移和点击旋转操作。用户可以自由拼接图形,拼出各种造型。该应用帮助学生直观理解图形的平移、旋转、对称等几何变换,以及面积守恒…...

TripoSR:0.5秒单图像3D重建技术指南与实战应用

TripoSR&#xff1a;0.5秒单图像3D重建技术指南与实战应用 【免费下载链接】TripoSR 项目地址: https://gitcode.com/GitHub_Trending/tr/TripoSR 在3D内容创作领域&#xff0c;传统建模流程耗时耗力&#xff0c;而TripoSR作为开源3D重建模型&#xff0c;通过单张2D图像…...

杰理之spp收发数据处理没有找到的问题处理【篇】

原因&#xff1a;开启#define CONFIG_APP_BT_ENABLE 宏配置后&#xff0c;spp的收发处理的回调默认会被库里面接管&#xff0c;所以在app层是看不到的。...

FRCRN开源模型部署指南:国产昇腾Ascend 910B适配与性能实测

FRCRN开源模型部署指南&#xff1a;国产昇腾Ascend 910B适配与性能实测 1. 项目概述与背景 FRCRN&#xff08;Frequency-Recurrent Convolutional Recurrent Network&#xff09;是阿里巴巴达摩院在ModelScope社区开源的单通道语音降噪模型&#xff0c;专门针对16kHz采样率的…...

太原理工大学Web开发历年真题解析:期末复习必备指南(附最新试卷)

太原理工大学Web开发核心考点深度剖析与高效复习方法论 Web开发课程期末备考的战略视角 又到了期末季&#xff0c;作为太原理工大学计算机相关专业的学生&#xff0c;面对Web开发这门实践性极强的课程&#xff0c;你是否还在为如何高效复习而焦虑&#xff1f;不同于传统理论课…...

wan2.1-vae开源模型价值:相比闭源方案节省90%图像生成API调用成本

wan2.1-vae开源模型价值&#xff1a;相比闭源方案节省90%图像生成API调用成本 你有没有算过&#xff0c;每个月花在AI图像生成上的钱有多少&#xff1f; 如果你是内容创作者、电商运营、设计师&#xff0c;或者任何需要大量图片素材的人&#xff0c;可能已经习惯了这样的场景…...

成长规划师 - OpenClaw助力个人发展

每周进步1%&#xff0c;一年后你会比现在优秀37倍你有没有过这样的感觉&#xff1a; 一周忙忙碌碌&#xff0c;周五回顾时却想不起做了什么重要的事&#xff1f;年初立下的flag&#xff0c;到了年底发现一个都没实现&#xff1f;羡慕别人技能满满&#xff0c;自己却不知道从哪里…...

3分钟打造个性化英雄联盟体验:LeaguePrank工具让段位展示彻底自定义

3分钟打造个性化英雄联盟体验&#xff1a;LeaguePrank工具让段位展示彻底自定义 【免费下载链接】LeaguePrank 项目地址: https://gitcode.com/gh_mirrors/le/LeaguePrank 你是否曾想在好友面前展示独特的游戏段位&#xff1f;是否希望自己的游戏生涯页面与众不同&…...