문제

모두,

원래 sqlloader (Oracles Data Upload Tool)라는 쉘 스크립트가있었습니다.

문제는 sqlloader가 일반 텍스트 비밀번호를 입력으로 가져 가서 Sqlloader를 내부적으로 명령 문자열에 전달하기 위해 Java 응용 프로그램을 작성하기로 결정했습니다.

예를 들어

sqlldr user/pass@dbserver control = ../sqlloader.ctl log = sqlloader.log data = 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를 다른 사용자/ 스레드로 실행합니까?

이것은 내 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 a 프로세스 그런 다음 System.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) 시작하는 과정에서.

exec () 후 exit ()을 호출하면 Java는 즉시 종료합니다.

다음은 runtime.exec 함정을 설명하는 기사입니다. http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html?page=4 (다른 페이지도 고려하십시오).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top