文档章节

获取linux管道命令结果

g
 gongsiai
发布于 2017/02/06 15:38
字数 552
阅读 6
收藏 0

当命令中含有管道(即命令符 | )的时候,使用命令的时候可以获取值,但是使用程序得到的就是空。

解决方式很简单,用sh -c ,再加上原先的命令串即可解决问题:

Process ps = Runtime.getRuntime().exec(new String[]{"sh", "-c", cpCommander});
            
            BufferedReader br = new BufferedReader(new InputStreamReader(ps.getInputStream()));
            StringBuffer sb = new StringBuffer();
            String line;
            while ((line = br.readLine()) != null) {
                sb.append(line).append("\n");
            }
            String result = sb.toString();
            log.info("@@##进程结果:"+result);
            // 将获取结果去除回车拆分
            String[] resultStr = result.split("\n");
            for (int j = 0; j < resultStr.length - 1; j++) {
                String s = resultStr[j + 1];
                // 去除tab键
                s = s.replace("    ", " ");
                // 将所有的多空格转成单空格
                s = s.replaceAll(" +", " ");
                if (s.startsWith(" ")) {
                    // 将第一个空格截取去除
                    s = s.substring(1, s.length());
                }
                // 将数据以空格拆分:root 2737 1 0 Feb05 ? 00:00:00 /usr/sbin/acpid
                String[] retStr = s.split(" ");
                // 获取cp进程结果的最后一个数据(所下达的指令为何)
                String cmdCommander = retStr[7];
                log.info("logCode+cp进程结果的最后一个数据,即cp指令:"+cmdCommander);
                log.info("fileName:"+fileName);
                log.info(logCode+"pid为:"+retStr[1]);
                if(cmdCommander.contains(fileName)){
                    log.info(logCode+"cp进程结果的最后一个数据,即cp指令包含文件名称。");
                    // 包含文件名,说明这个进程为要杀死的cp进程。获取进程的pid(第二个数据)。
                    String pid = retStr[1];
                    log.info(logCode+"pid为:"+pid);
                    // 获取cp进程的标识号,拼接杀进程指令kill -9 进程标识号
                    String killCommander = "kill -9 " + pid;
                    // 执行杀进程指令
                    log.info(logCode+"---开始执行kill指令:"+killCommander);
                    Runtime.getRuntime().exec(killCommander);
                    log.info(logCode+"---执行kill指令完毕。");
                }
            }
            // 然后执行删除异常文件的指令
            log.info(logCode+"---开始执行rm指令:"+rmCommander);
            Runtime.getRuntime().exec(rmCommander).waitFor();
            log.info(logCode+"---执行rm指令完毕。");

带有管道或重定向的命令就会出错。如果带有参数就要把命令分割成数组或者List传入,不然会被当成一个整体执行(会出错,比如执行"ps -e")。对于|,<,>号来说,这样做也不行。对于Linux系统,解决方法就是把整个命令都当成sh的参数传入,用sh来执行命令。Windows下把sh换成cmd.exe就行了。

参考的另一种方式:

List<String> cmds = new ArrayList<String>();

cmds.add("sh");

cmds.add("-c");

cmds.add("ps -ef | grep -v grep");

ProcessBuilder=new ProcessBuilder(cmds);

Process p = pb.start();

 

© 著作权归作者所有

共有 人打赏支持
g

gongsiai

粉丝 1
博文 27
码字总数 10914
作品 0
大兴
程序员
私信 提问
怎样理解和识别 Linux 中的文件类型

众所周知,在 Linux 中一切皆为文件,包括硬盘和显卡等。在 Linux 中导航时,大部分的文件都是普通文件和目录文件。但是也有其他的类型,对应于 5 类不同的作用。因此,理解 Linux 中的文件类...

作者: Magesh Maruthamuthu
04/12
0
0
使用 Ultimate Plumber 即时预览管道命令结果

管道命令的作用是将一个命令/程序/进程的输出发送给另一个命令/程序/进程,以便将输出结果进行进一步的处理。我们可以通过使用管道命令把多个命令组合起来,使一个命令的标准输入或输出重定向...

作者: Sk
2018/11/08
0
0
将Linux命令的结果作为下一个命令的参数

KISS:keep it short and simple! 1. 符号: 名称:反引号,上分隔符 位置:反引号(`)这个字符一般在键盘的左上角,数字1的左边,不要将其同单引号(’)混淆 作用:反引号括起来的字符串被...

Honghe
2013/03/07
0
3
在 Linux 命令行使用 more 查看文本文件

文本文件和 Linux 一直是携手并进的。或者说看起来如此。那你又是依靠哪些让你使用起来很舒服的工具来查看这些文本文件的呢? Linux 下有很多实用工具可以让你在终端界面查看文本文件。其中一...

作者: Scott Nesbitt
02/12
0
0
介绍 Linux 中的管道和命名管道

要在命令间移动数据?使用管道可使此过程便捷。 在 Linux 中, 能让你将一个命令的输出发送给另一个命令。管道,如它的名称那样,能重定向一个进程的标准输出、输入和错误到另一个进程,以便...

作者: Archit Modi
2018/09/08
0
0

没有更多内容

加载失败,请刷新页面

加载更多

/sbin/ldconfig.real: /usr/local/lib/libcudnn.so.7 不是符号链接

平台:Ubuntu 18 LTS 问题描述 /sbin/ldconfig.real: /usr/local/lib/libcudnn.so.7 不是符号链接 解决办法:建立软连接 sudo ln -sf /usr/local/lib/libcudnn.so.7.1.3 /usr/local/lib/libc......

Pulsar-V
8分钟前
0
0
C++多线程之使用Mutex和Critical_Section

Mutex和Critical Section都是主要用于限制多线程(Multithread)对全局或共享的变量、对象或内存空间的访问。下面是其主要的异同点(不同的地方用绿色表示)。 Mutex Critical Section 性能和...

shzwork
22分钟前
0
0
AWS的自动部署工具codedeploy 部署前的准备工作

开始部署codedeploy: 1.先预置IAM用户: 创建一个IAM用户或使用一个与AWS相关联的用户; 复制以下的策略附加到IAM用户,向IAM用户赋予对codedeploy(及codedeploy所依赖的AWS服务和操作)的...

守护-创造
34分钟前
1
0
这可能是最详细的一线大厂Mysql面试题详解了

1、MySQL的复制原理以及流程 基本原理流程,3个线程以及之间的关联; 主:binlog线程——记录下所有改变了数据库数据的语句,放进master上的binlog中; 从:io线程——在使用start slave 之后...

Java干货分享
44分钟前
3
0
人的精力是什么?如何强化精力

人的精力是什么? 人的精力是什么? 精力指精神和体力。精神包括一个人的精神状态,兴奋度,做事情的投入度,专注度,持续时间等。 人的精力来源 人的精力有4种来源,身体的、情感的、思想的和...

莫库什勒
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部