2012-01-22 9 views
5

Estoy intentando llamar a mi ejecutable de Linux desde el script de shell. Antes de llamar a este ejecutable, quiero establecer LD_LIBRARY_PATH con valores específicos. Mi script es como a continuación:No se puede establecer LD_LIBRARY_PATH para el proceso de Java

Parent.sh (contiene 2 líneas)

- source set_env.sh 
    - executable.so 

Set_env.sh

- setenv LD_LIBRARY_PATH /proj/something 

Al ejecutar manualmente Parent.sh scipt de consola de Linux, el ejecutable. así se llama con LD_LIBRARY_PATH establecido correctamente. Pero después de la integración de código Java que wiht como:

String[] commandArray ={"Parent.sh"}; 
Runtime runtime = Runtime.getRuntime(); 
Process javap = runtime.exec(commandArray); 
javap.waitFor(); 

LD_LIBRARY_PATH no está ajustada para executable.so

espero descripción es clara :)

Por favor, vamos a saber cuál es incorrecto en el código.

+0

Muchas gracias querido por buena pregunta + 1vote –

Respuesta

16

Dunes respuesta resuelve su problema, pero yo sugeriría encarecidamente un enfoque diferente en este caso particular. En lugar de confiar en un shell para establecer los argumentos del entorno, debe hacer esto en su código Java. De esta forma, no necesita saber qué shells existen en el sistema y cuál es su idioma, simplemente funcionará en todas las plataformas.

Para hacer esto, puede usar la sobrecarga Runtime.exec(String[] cmd, String[] environment) (javadoc). Como segundo parámetro, puede pasar una matriz que contiene todas las variables de entorno que verá el subproceso.

Un poco mejor aun es el ProcessBuilder API:

ProcessBuilder pb = new ProcessBuilder("executable.so"); 
Map<String, String> env = pb.environment(); 
env.put("LD_LIBRARY_PATH", "/proj/something"); 
Process javap = pb.start(); 
javap.waitFor(); 

De esta manera, el subproceso heredará todas las variables de entorno del proceso de Java, y, además, tienen la LD_LIBRARY_PATH conjunto de variables.

+0

array de entorno agregado para LD_LIBRARY_PATH y funciona bien. Ahora no dependo del shell iterpreters. Gracias a Dune y Philipp por sus valiosas respuestas, que tardaron unas 6-7 horas en depurar, pero no pudieron acceder a esto. –

+0

muchas gracias Estimado +1 por buena respuesta –

1

¿Estás seguro de que el subproceso está usando csh? Si se inicia con bash u otra cosa, esto evitaría que el script funcione (pero no arrojará una IOException).

Debería tomar una línea de hashbang como la primera línea de su script para indicar qué intérprete de intérprete de comandos desea usar.

por ejemplo.

#!/usr/bin/env csh 
+0

muchas gracias ... funcionó al primer golpe ... INCREÍBLE !!!! Sí, actualmente estoy probando en csh. ¿Puede por favor saber cómo verificar el intérprete de intérprete de comandos disponible en lunux corriendo actual en tiempo de ejecución en Java para poder modificar este archivo .sh en tiempo de ejecución? –

Cuestiones relacionadas