【问题标题】:Running a shell script from Java从 Java 运行 shell 脚本
【发布时间】:2015-05-15 16:16:05
【问题描述】:

我在尝试从 Java 运行 sh 脚本时遇到问题。我已经尝试过 similar problems at stack overflow 的解决方案。

问题不是脚本本身的调用,而是命令pg_dump

=> 如果我从控制台 ./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 中调用它?

【问题讨论】:

  • 尝试将 #!/bin/bash 作为脚本的第一行。

标签: java bash shell sh processbuilder


【解决方案1】:

你可以试试这个

 try {
       ProcessBuilder pb = new ProcessBuilder("script.sh");
       Process p = pb.start();     
       p.waitFor();                
       System.out.println("Script executed Finish");
     } 
     catch (Exception e) 
     {
      e.printStackTrace();
    }

【讨论】:

  • 已经;编辑我的问题以提供所有异常管理。对不起!
【解决方案2】:

我猜 pg_dump 对输入/输出流做了一些相对复杂的事情,所以您可能遇到了http://www.javaworld.com/article/2071275/core-java/when-runtime-exec---won-t.html 中列出的一些陷阱@ 这篇文章中有代码清单,在这种情况下可能会有所帮助。

【讨论】:

    猜你喜欢
    • 2018-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多