Java-执行 Shell 命令不起作用

Posted

技术标签:

【中文标题】Java-执行 Shell 命令不起作用【英文标题】:Java- Execute Shell Command Not Working 【发布时间】:2014-07-12 17:48:51 【问题描述】:

我正在制作一个简单的 Java 套接字程序,可以将文本从一台计算机发送到另一台计算机。

代码:

    Scanner scan =  new Scanner(System.in);
    System.out.println("Starting Server...");
    ServerSocket server = new ServerSocket(7777);

程序在上面代码示例的第 3 行将套接字绑定到端口 7777。 但是,此程序有时会返回 BindException。为了解决这个问题,我在绑定发生之前添加了这行代码:


Runtime.getRuntime().exec("lsof -t -i:7777 | xargs kill");

总之:


    Scanner scan =  new Scanner(System.in);
    System.out.println("Starting Server...");
    Runtime.getRuntime().exec("lsof -t -i:7777 | xargs kill");
    ServerSocket server = new ServerSocket(7777);

应该运行 shell 命令来杀死在端口 7777 上运行的所有进程。 但是,事实并非如此。如果在 Terminal.app 中键入相同的命令,它可以工作,并且如果我使用与上述示例的第 4 行相同的语法并使用不同的命令,例如“say hello”,那么该命令可以工作,但不是 kill 那个。


所以,

为什么该命令不执行?

谢谢。

【问题讨论】:

为什么投反对票?有什么我可以改变的吗? 【参考方案1】:

Runtime.exec不会通过 shell 启动命令,而在使用 管道 时这是必需的。试试吧:

Runtime.getRuntime().exec(
              new String[]"sh","-c","lsof -t -i:7777 | xargs kill",
              null, null);

我需要在继续执行之前等待完成,使用Process.waitFor

Process p = Runtime.getRuntime().exec(
              new String[]"sh","-c","lsof -t -i:7777 | xargs kill",
              null, null);
int exitCode = p.waitFor()

【讨论】:

谢谢。效果很好!!我还需要在命令执行下方添加Thread.sleep(156) 以使其有时间执行。我发现,在我的电脑上,156ms 是我可以使用的最少时间。 @user3731821 我已经编辑了我的答案以指出Process.waitFor。绝对比经验时间更强大;) 谢谢。这是个好主意! 出于某种原因,这在我的计算机上等待的时间不够长。我在杀死端口上的进程后直接绑定套接字,我应该先做其他事情吗?

以上是关于Java-执行 Shell 命令不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Shell BackButtonBehavior 命令绑定在 UWP 中不起作用

为啥 Google Colab shell 命令不起作用?

教义命令行界面不起作用

在函数参数中发送 shell 命令不起作用

用于发送邮件的 php 脚本在通过浏览器执行时不起作用,但在从命令行执行时工作正常

Flyway Java 迁移在命令行工具中不起作用