Question

Tout,

J'avais à l'origine un script shell appelé SqlLoader (Oracles Data Téléchargez l'outil).

Le problème était que Sqlloader prend un mot de passe en texte brut en entrée, j'ai donc décidé de créer une application Java pour appeler SqlLoader en passant en interne un mot de passe déchiffré dans la chaîne de commande.

par exemple

sqlldr user / pass @ dbserver contrôle = .. / sqlloader.ctl log = sqlloader.log data = mydata.csv

Donc, avec mon emballage Java, c'est devenu cela dans mon script de shell

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

Cependant, un nouveau problème s'est développé lorsque SqlLoader s'est plaint qu'il n'y avait pas de fichier à charger. Après un grattage de tête, il a été découvert qu'une commande ultérieure dans mon script de shell semblait s'exécuter pendant que mon application Java était toujours en cours d'exécution. Par conséquent, il se comportait de manière asynchrone.

La commande suivante déplaçait le fichier d'entrée que Sqlloader utilisait avant d'avoir la possibilité de l'utiliser. J'ai donc mis une commande de sommeil en 20 secondes pour donner à mon temps d'application Java pour s'exécuter.

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

Quelqu'un sait-il pourquoi Unix se comporte de cette façon, Java exécute-t-elle mon sqlloader en tant qu'utilisateur / thread différent?

Ceci est mon code java:

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

J'ai vérifié la classe d'exécution pour tout ce qui est asynchrone mais je n'ai rien trouvé

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

Des théories ou des suggestions?

Merci

Était-ce utile?

La solution

Oui. Si vous regardez à nouveau Runtime.exec, il spécifie qu'il lancera un nouveau processus dans l'environnement spécifié (par exemple, indépendamment de «l'environnement» actuel ou comme vous le mettez de manière asynchrone). Tu devrais utiliser Procès-verbal créer un Traiter Et puis attendez ce processus pour terminer avant d'appeler System.exit - ce qui n'est certainement pas obligatoire. Quelque chose comme ça

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);
}

Autres conseils

Vous devez attendre l'achèvement du processus, vous devez également lire toutes les sorties (Stdout et stderr) du processus que vous commencez.

Si vous appelez exit () après exec (), Java fera exactement cela - quitter immédiatement.

Voici un article qui explique Runtime.exec Pitfall: http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html?page=4 (Considérez également les autres pages).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top