[英]Running a shell script from Java
我在尝试从Java运行sh脚本时遇到问题。 我已经尝试过解决栈溢出时类似问题的解决方案。
问题不在于脚本本身的调用,而是命令pg_dump :
=>如果我从控制台./my_script.sh
运行以下脚本, ./my_script.sh
一切正常:
NOW="$(date +%Y%m%d_%H%M%S)"
BACKUP_FILE="backup_${NOW}.sql"
FOLDER="./backups"
if [ ! -d "$FOLDER" ]; then
mkdir $FOLDER
fi
OUTPUT=${FOLDER}/${BACKUP_FILE}
HOST="my.host.dir"
PORT="8080"
DB_NAME="dbName"
USER="user"
PASS="pass"
OPT="-h ${HOST} -p ${PORT} -U ${USER} -f ${OUTPUT} -c -C -i -b -v ${DB_NAME}"
EXPORT="export PGPASSWORD=${PASS}"
RUN="pg_dump ${OPT}"
echo ${EXPORT}
echo ${RUN}
$EXPORT
$RUN
=>但是,如果我想从Java代码中调用它,则echo
命令成功(因此脚本已被调用),但是pg_dump
命令不是:
int exitValue = 0;
try {
ProcessBuilder pb = new ProcessBuilder(scriptPath);
Process p = pb.start();
BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line = null;
while ((line = reader.readLine()) != null) {
LOG.log(Level.FINE, line);
}
exitValue = p.waitFor();
LOG.log(Level.FINE, "Process exitValue: " + exitValue);
} catch (IOException | InterruptedException e) {
LOG.log(Level.SEVERE, "Executing " + scriptPath, e);
return false;
}
return exitValue == 0;
我的问题是,为什么控制台成功却使用相同的脚本,而不是从Java调用它?
你可以试试这个
try {
ProcessBuilder pb = new ProcessBuilder("script.sh");
Process p = pb.start();
p.waitFor();
System.out.println("Script executed Finish");
}
catch (Exception e)
{
e.printStackTrace();
}
我猜pg_dump在输入/输出流中做了一些相对复杂的事情,所以您可能已经遇到了http://www.javaworld.com/article/2071275/core-java/when-runtime-exec---中列出的一些pitfal 。 won-t.html本文中包含代码清单,在这种情况下可能会有所帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.