Runtime.getRuntime().exec()

来源:互联网 发布:金磐网络科技园 编辑:程序博客网 时间:2024/04/24 03:13

转帖:http://www.javaeye.com/topic/146588

问题

  • java 使用Runtime.getRuntime().execx执行kstat -p -m /'/^e1000g0|^e1000g$//'失败
    • m_process.waitFor()总是返回1
    • 0 表示命令执行成功
    • 1 表示命令语法错误
    • 2 表示命令执行错误
  • 解决过程
    • 开始不知道为什么出错
      • 将命令改为 kstat -p -m /^e1000g0/就可以成功
      • 将上了单引号以后,就始终返回1, 即语法错误
      • 尝试将单引号改为双引号还是出错
        • 但是双引号在solaris下也能执行成功
    • 问google
      • 查Runtime.getRuntime.exec
        • 发现有个老兄翻译的别人的一篇文章中有提到,使用Runtime.getRuntime.exec调用重定向有问题
        • 心里隐约觉得,自己的方向可能错了,可能并不是一个单引号那么简单的,导致waitFor返回1
        • http://lusong163.itpub.net/post/14139/66778
      • 查getRuntime().exec 重定向
        • 这是第二天的事了,前天弄到晚上十点,没解决
          • 知道没那么容易解决,自己的身体要紧,明天还要回上海呢
        • 找到另一个老兄的问题
          • http://topic.csdn.net/t/20050309/16/3837564.html#
          • 他遇到的和我的不一样,他是调用 ps   -ef   |   grep   SSS   |   grep   -v   grep   |   awk   '{print   $2}'  
          • 我估计可能也是和这个引号有关系
          • 后面有个哥们给了个答案
            • 天啊,就就是这个答案让我灵光一现

              (new   String[]{"/bin/sh","-c","ps   -ef   |   grep   usb   |   grep   -v   grep   |   awk   '{print   $2}'"});      这样就可以了.我在Linux系统上试过

              注意到了没,命令不是直接使用的ps,那么我在命令中直接使用kstat是不是也是问题呢

    • 解决了
      • 根据最后一次找到的哪个关键的帖子
      • 将我的命令改为
        • String[] cmd1 = new String[3]; cmd1[0] = "/bin/sh"; cmd1[1] = "-c"; cmd1[2] = "kstat -p -m /'/^e1000g0|^e1000g$//'";

          执行成功啦!!!

      • 后来验证,关键在 /bin/sh -c 这个命令头
        • 这个在window下执行命令是要使用 cmd作为命令的开头是一个道理
          • 就是因为dir命令是由windows中的解释器解释的,直接执行dir时无法找到dir.exe这个命令,所以会出现文件未找到这个2的错误。如果我们要执行这样的命令,就要先根据操作系统的不同执行不同的解释程序command.com 或者cmd.exe。 (这段是copy的)

            "CMD" "/C" ; windows命令中的开头

        • 不过这个现象在solaris中可能只出现在哪些有特殊字符的命令中,比如有单引号什么
      • 发现了一个问题
        • 在这个链接中是翻译的老外写的一篇文章,
          • http://lusong163.itpub.net/post/14139/66778
          • 原文地址 http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html
          • 其中也提到了  redirect the output of an echo program's simple Java version into the file test.txt.
          • 他给出的解决方案是自己写代码重定向文件
        • 但是我后来做了一下验证,发现是可以实现重定向文件的
          • /bin/sh
          • -c
          • ls > t.txt
          • 这个命令的执行一点问题都没有,t.txt文件也产生了
          • 但是使用 java -version >t.txt 能产生文件,但是文件中却没有内容