所有人,

我原本有一个脚本,称为SQLLoader(神谕的数据上传工具)。

问题是,SQLLoader需要一个普通的文本的密码输入因此,我决定建立一个Java应用程序叫SQLLoader内部传递解密的密码进入该命令串。

例如

sqlldr用户/pass@DBServer控制=../sqlloader.ctl日志=sqlloader.日志数据=mydata.csv

所以我java包装它成为这个在我的脚本

java -jar sqlloader.jar sqlloader.ctl mydata.csv

但是一个新问题,开发当SQLLoader抱怨说,没有文件加载。后一些挠头发现,随后命令我的脚本似乎是执行的话,我java应用程序仍然运行。因此它的行为是异步的。

下命令运输入文件sqlloader是使用之前,它可以得到一个机会来使用它。所以我把一个睡觉的命令在20秒钟,给我的java应用程序的运行时间。

java -jar sqlloader.jar sqlloader.ctl mydata.csv
echo $?
sleep 20
if [ $? -ne 0 ]
    then
        echo "SQLLoader failed during execution, please check the log : " 
        mv mydata.csv

else
    echo "SQLLoader successfully processed file : "
    mv mydata.csv
fi

没有人知道为什么unix行为这种方式,并Java执行我SQLLoader作为一个不同的用户/thread?

这是我的java:

    Runtime Rt;
Process Prc;
    Prc = Rt.exec("sqlldr user/decryptedpass@DBServer control=../sqlloader.ctl log=sqlloader.log data=mydata.csv);
system.exit(0);

我检查运行时级为什么它是异步但不可能找到任何东西

http://docs.oracle.com/javase/7/docs/api/java/lang/Runtime.html

任何理论或建议?

感谢

有帮助吗?

解决方案

是的。如果您再次查看runtime.exec,它确实指定它将在指定的环境中启动新过程(例如,独立于当前的“环境”或异步将其启动)。您应该使用 ProcessBuilder 创建一个 过程 然后等待该过程在呼叫系统之前完成。EXIT-这肯定不是强制性的。这样的东西

public static void main(String[] args) {
    // String command = "/usr/bin/sleep 5";
    List<String> command = new ArrayList<String>();
    command.add("c:/cygwin/bin/sleep");
    command.add("5");
    ProcessBuilder pb = new ProcessBuilder(command);
    BufferedReader is = null;
    try {
        System.out.println("Starting command " + command);
        Process p = pb.start();

        int ret = p.waitFor();
        is = new BufferedReader(new InputStreamReader(p.getInputStream()));
        String line;
        while ((line = is.readLine()) != null) {
            System.out.println(line);
        }
        if (ret == 0) {
            System.out.println("Command has completed.");
            System.exit(ret);
        } else {
            System.out.println("Command completed with return code " + ret);
            System.exit(ret);
        }
    } catch (Exception e) {
        System.out.println("Caught Exception " + e.getMessage()
                + " running command " + command);
        e.printStackTrace();
    } finally {
        if (is != null) {
            try {
                is.close();
            } catch (IOException e) {
            }
        }
    }
    System.out.println("COMMAND FAILED");
    System.exit(1);
}

其他提示

你需要等待进程的完成,还应该阅读的所有输出(stdout stderr)从过程中,你已经开始。

如果你call exit()后exec()、Java会做的只是,出口可直接.

这是一篇文章,介绍了运行时间。exec陷阱: http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html?page=4 (还可考虑其他页)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top