使用Java顺序执行两个或多个shell命令

时间:2018-04-09 11:14:06

标签: java shell processbuilder

我想依次在Linux上的shell中执行 telnet msh 。我可以使用Java中的以下代码执行telnet命令,但不能执行msh命令:

> print(Ar.model)
Series: d[, 3] 
ARIMA(2,0,2) with non-zero mean 

Coefficients:
          ar1      ar2     ma1     ma2    mean
      -0.0566  -0.8144  0.0208  0.8187  0.0262
s.e.   0.1570   0.1050  0.1506  0.1122  0.0183

sigma^2 estimated as 0.9852:  log likelihood=-3997.69
AIC=8007.39   AICc=8007.42   BIC=8043.08

对此的任何帮助都非常感谢。

2 个答案:

答案 0 :(得分:0)

您应该有两个不同的命令按顺序执行,如下所示: -

 String[] command_telnet ={"\path\to\telnet", "10.x.x.x 1234"};
 String[] command_msh ={"\path\to\msh", "parameter"};

 ProcessBuilder pb_telnet = new ProcessBuilder(commands);
 pb_telnet.directory(new File("/home/user/telnet_output.txt"));
 pb_telnet.redirectErrorStream(true);
 Process process_tel = pb_telnet.start();

command_msh执行相同操作。这种方法很容易调试,因为您将在/home/user/msh_output.txt

中获得命令输出

答案 1 :(得分:0)

您目前正在执行的Java是以下内容(或多或少;以下内容可以在Shell中执行,Java直接调用进程):

/bin/bash -c 'telnet 10.x.x.x 1234' 'msh'

这导致Bash执行telnet,因为这是-c标志的参数,msh参数将被忽略:Bash不知道如何处理它。

有两种可能的解决方案。

解决方案1:让Bash按顺序执行两个命令。
为此,您需要执行以下行中的内容

/bin/bash -c 'telnet 10.x.x.x 1234; msh'

转换为您必须合并commands列表中的最后两个字符串。例如,

commands.add("telnet 10.x.x.x 1234; msh");

您也可以使用;而不是&&。有关详细信息,请参阅Unix.SE

缺点:Bash只会告诉您最后一个进程的退出代码。在使用&&的情况下,第一个命令失败甚至不会执行第二个命令。

解决方案2:为每个人创建一个单独的Java流程。
对于此解决方案,您基本上必须重复所有代码以调用msh。如果你走这条路,我建议把它包装成一个函数。只需使用{"/bin/bash", "-c", "telnet 10.x.x.x 1234"}作为一个调用的commands列表,并使用{"/bin/bash", "-c", "msh"}作为其他调用。

优点是您可以在Java程序中拥有更多控制权,而不是使用Bash处理事物。缺点是你开始了两个不同的过程,但Bash可能会在引擎盖下做到这一点。

附注:您可以直接执行telnet和msh而无需调用Bash并告诉它为您运行telnet或msh。这可能更好,更有效。