java执行Python或者Shell

问题描述

​ 使用阿里的datax进行数据的同步,一开始用手动同步,在shell命令行执行python命令,没毛病。现在需要改成定时自动增量同步。所以使用Spring来实现定时任务的执行。这就涉及到使用JAVA来调用python脚本了,执行后,发现数据都没有同步成功。

问题分析

​ 一开始用Process对象的getInputStream()获取输出结果,只有部分的输出结果,对比直接在shell命令行执行的输出结果还少了很多日志打印。

​ 接着就怀疑是不是datax打印的日志太多了导致语句不能正常执行,于是就把logback.xml的stdout输出注释掉。问题依旧。

​ 于是就在想怎么查看错误日志,看了datax的log目录底下的日志,没有错误信息。 通过 Process对象的 getErrorStream查看到了错误信息: /bin/sh/: java : command not found

解决方法

​ 报错的原因是java在执行python脚本的时候,默认是用系统的/bin/目录下的命令。 错误提示java命令找不到,那么就需要将java命令添加到/bin/目录底下,通过建立link来关联 java的命令

ln -s /usr/jdk1.7/bin java

再次通过java执行python脚本进行数据同步,同步成功。

部分源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Process process = Runtime.getRuntime().exec(cmds);
process.waitFor();
// 打印正常的输出结果
in = process.getInputStream();
reader = new BufferedReader(new InputStreamReader(in));
logger.info("执行命令结果:");
String line ;
while((line = reader.readLine()) != null) {
logger.info("{}", line);
}
// 打印错误的输出结果
List<String> errorLines = new ArrayList<>();
errReader = new BufferedReader(new InputStreamReader(process.getErrorStream()));
while((line = errReader.readLine()) != null) {
errorLines.add(line);
}
if(errorLines.size()>0) {
logger.error("执行命令出错信息:");
for(String errorLine : errorLines){
logger.error(errorLine);
}
}

<<< 捐赠 >>>

转载请注明出处! 原文地址: http://webinglin.github.io

Reference:

webinglin.github.io

留言

2017-05-04