在SpringBoot项目中需要调用外部的可执行程序,该项目运行在Linux环境中,通过Java Runtime.exec来调用可执行程序,碰见很多问题
在Linux中执行以下两个命令,都可以成功调用可执行程序 cprogram
# command 1
bash -c /tmp/test/cprogram arg1 agr2
# command 2
/tmp/test/cprogram arg1 arg2
但在Java中通过Java Runtime.exec来执行shell命令,有不少问题
通过 Runtime.getRuntime().exec(String cmd) 和 Runtime.getRuntime().exec(String[] cmds) 调用
cmd="bash -c /tmp/test/cprogram arg1 arg2"
cmds=new String[]{"bash","-c","/tmp/test/cprogram arg1 arg2"}
报错信息:java.io.IOException: error=2, No such file or directory
cmd="bash -c "/tmp/test/cprogram arg1 arg2""
cmds=new String[]{"bash -c "/tmp/test/cprogram arg1 arg2""}
报错信息:unexpected EOF while looking for matching `''
-classpath: -c: line 1: syntax error: unexpected end of file
执行 cmd="/tmp/test/cprogram arg1 arg2",终于不报错了,无任何错误日志,但就是没有接收到程序返回结果,发现其实是可执行程序只是返回了结果,没有打印出结果,导致一直没有收到执行结果
如果还存在问题,可以写一个 xxx.sh文件,在shell脚本中写函数,用于执行对应的命令就行,将执行操作交给shell脚本完成
总结:通过Java Runtime.exec执行可执行程序(传参数,打印结果),可以执行命令
Java Runtime.exec("/tmp/test/cprogram arg1 arg2")