无法使用Java运行linux命令

无法使用Java运行linux命令,java,linux,Java,Linux,我正在使用ProcessBuilder在服务器上运行Linux命令: ProcessBuilder pb = new ProcessBuilder("/usr/bin/printf %b", sendMessage, URL, " @serendipity | /usr/bin/perl /usr/local/bin/foo/bar -u nagios -s"); 我正在尝试广播一条消息,该消息将通过管道传输到一个名为bar的寻呼系统。但是,在服务器上执行jar

我正在使用ProcessBuilder在服务器上运行Linux命令:

ProcessBuilder pb = new ProcessBuilder("/usr/bin/printf %b", sendMessage,
                URL, " @serendipity | /usr/bin/perl /usr/local/bin/foo/bar -u nagios -s");
我正在尝试广播一条消息,该消息将通过管道传输到一个名为bar的寻呼系统。但是,在服务器上执行jar文件时,我经常会得到以下结果:

java.io.IOException: Cannot run program "/usr/bin/printf %b": error=2, No such file or directory
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
    at sms_serendipity.sms_serendipity.SmsSendMessage.sendMessage(SmsSendMessage.java:59)
    at sms_serendipity.sms_serendipity.SmsSendMessage.randomizeLinks(SmsSendMessage.java:48)
    at sms_serendipity.sms_serendipity.SmsParseWeb.regexHttp(SmsParseWeb.java:103)
    at sms_serendipity.sms_serendipity.SmsParseWeb.parseXML(SmsParseWeb.java:77)
    at sms_serendipity.sms_serendipity.SmsParseWeb.locateWebAudio(SmsParseWeb.java:44)
    at sms_serendipity.sms_serendipity.mainClass.main(mainClass.java:11)
Caused by: java.io.IOException: error=2, No such file or directory
    at java.lang.UNIXProcess.forkAndExec(Native Method)
    at java.lang.UNIXProcess.<init>(UNIXProcess.java:247)
    at java.lang.ProcessImpl.start(ProcessImpl.java:134)
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
    ... 6 more
java.io.IOException:无法运行程序“/usr/bin/printf%b”:错误=2,没有这样的文件或目录
位于java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
在sms_serendipity.sms_serendipity.SmsSendMessage.sendMessage(SmsSendMessage.java:59)
在sms_serendipity.sms_serendipity.SmsSendMessage.randomizeLinks(SmsSendMessage.java:48)
在sms_serendipity.sms_serendipity.SmsParseWeb.regexHttp(SmsParseWeb.java:103)
在sms_serendipity.sms_serendipity.SmsParseWeb.parseXML(SmsParseWeb.java:77)
在sms_serendipity.sms_serendipity.SmsParseWeb.locateWebAudio(SmsParseWeb.java:44)
在sms_serendipity.sms_serendipity.mainClass.main(mainClass.java:11)
原因:java.io.IOException:error=2,没有这样的文件或目录
位于java.lang.UNIXProcess.forkAndExec(本机方法)
位于java.lang.UNIXProcess(UNIXProcess.java:247)
在java.lang.ProcessImpl.start(ProcessImpl.java:134)处
位于java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
... 还有6个

这是我第一次使用ProcessBuilder(我也尝试了Runtime.exec()。有人能告诉我如何更正我试图运行的命令吗?

请仔细阅读错误消息:您试图执行程序
/usr/bin/printf%b
,该程序当然不存在


该程序名为
/usr/bin/printf

我已经找到了一种方法来实现这一点。这需要一点实验,但这里是我所做的

    ProcessBuilder pb = new ProcessBuilder(
            "/bin/dash", 
            "-c",
            "/usr/bin/perl /usr/local/bin/foo/bar -u nagios -s " + sendMessage + URL + fooUser,
            "/bin/echo");

我让它将标准输出记录到一个文本文件中,并确认广播正常

Java将从左到右逐字解释这些命令。你打算在那里进行一些字符串插值吗?是的,我是。它基本上是广播消息,有一些字符串可能是@zero298的副本。这根本不是一个副本。我不是在问ProcessBuider和Runtime.exec()之间的区别。您误用了
new ProcessBuilder()
,就好像它是
Runtime.exec()
。正如@Henry指出的,您正试图将命令传递给
ProcessBuilder()
,而不是程序名。这个问题详细说明了如何使用
ProcessBuilder()
,并明确指出了这一区别。我见过其他问题在这种情况下重复出现。我并不是说这是一个糟糕的问题,只是其他答案涵盖了您的问题。如果我去掉%b,它会抱怨操作数缺少新的ProcessBuilder(“/usr/bin/printf”,%b”,…尝试过,这更好。但它不执行perl脚本。因为管道仅由shell解释。您必须使用shell运行该命令。您是指整个命令吗?请提供一个示例,说明我提供的给定命令?