【问题标题】:Java- Execute Shell Command Not WorkingJava-执行 Shell 命令不起作用
【发布时间】:2023-09-27 07:21:01
【问题描述】:

我正在制作一个简单的 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 那个。


所以,

为什么该命令不执行?

谢谢。

【问题讨论】:

  • 为什么投反对票?有什么我可以改变的吗?

标签: java shell execution


【解决方案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。绝对比经验时间更强大;)
  • 谢谢。这是个好主意!
  • 出于某种原因,这在我的计算机上等待的时间不够长。我在杀死端口上的进程后直接绑定套接字,我应该先做其他事情吗?
最近更新 更多