鱼摸摸 2024-04-02 16:18 采纳率: 0%
浏览 20
已结题

java执行shell命令,Runtime.exec()和jsch谁更有优势?

java在linux平台,执行本机命令,众所周知都是使用Runtime.getRuntime().exec(command)获取一个Process类
但是都说这种方式各种坑,什么资源消耗大,频繁创建销毁代价大,缓冲区被打满导致死锁什么的
这里不考虑缓冲区死锁问题(因为有解决方案),就想知道这种方式开销有多大,shell频繁场景适用什么技术实现

有场景如下:有50个shell命令(只是目前水平,后续会更多),java需要定时执行shell,获取结果后解析入库。每个命令的定时时间从1分钟到30分钟不等,这样的场景下Runtime.getRuntime().exec还能用吗,有没有更好的选择?

目前有一种方式,同事因为怕搞不定Runtime.getRuntime().exec的坑,使用jsch封装的方法实现的。
我们都知道jsch是成熟的ssh方案,就是远程执行shell命令,同事在这里直接ssh了自己(本机),然后用jsch做的这个场景。
那么如果用jsch以ssh的方式执行本机命令(ssh自己)的开销又如何呢?

  • 写回答

1条回答 默认 最新

  • GISer Liu 2024-04-02 17:07
    关注

    该回答引用自GPT-3.5,由博主GISer Liu编写:

    针对您的问题,我会尽力提供详细的解答。
    首先,对于执行本机命令,Runtime.getRuntime().exec() 和使用 jsch
    这两种方式都是可行的,但各有优劣。

    1. Runtime.getRuntime().exec()方式:
    • 优势:简单易用,对于简单的场景可以满足需求。
    • 劣势:存在资源消耗大、频繁创建销毁代价大等问题。对于您描述的需要频繁执行多个命令的场景,可能不太适合,特别是如果存在频繁创建销毁的情况,可能会影响性能。
    1. 使用 jsch 方式:
    • 优势:jsch 是成熟的 SSH 方案,稳定性高,支持远程执行命令,也可以用于本地执行命令。可以避免 Runtime.getRuntime().exec() 的一些问题。
    • 劣势:相对于直接调用本地命令,jsch 方式可能稍微复杂一些,需要额外的代码来建立 SSH 连接。
      针对您描述的场景,如果您已经有同事使用 jsch 成功封装了方法,而且 jsch
      也可以用于本地执行命令,那么我建议您可以考虑继续沿用 jsch 方式。使用 jsch
      的开销相对较小,且稳定性较高,可以更好地应对您描述的需求。
      当然,您也可以根据具体情况进行测试,比较这两种方式在您的场景下的性能表现,以选择最适合您需求的方式。
      如果您需要更详细的代码示例或其他方面的帮助,请随时告诉我,我会尽力帮助您解决问题。

    如果该回答解决了您的问题,请采纳!如果没有,请私信联系或评论您的疑惑

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 7月30日
  • 修改了问题 4月2日
  • 创建了问题 4月2日