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 中不起作用