2010-12-02 19 views
13

que tienen comandos en un script bash que son similares a esta:Dentro de un script bash, ¿cómo obtener PID de un programa ejecutado cuando se utiliza el comando eval?

eval "(java -classpath ./ $classname ${arguments[@]} $redirection_options $file)" & 
pid=$! 

Sin embargo si hago un ps $pid que muestra el proceso de la escritura principal en lugar del proceso del programa Java.

Obtiene el proceso correcto cuando omito la evaluación, pero para que algunos de los argumentos complicados funcionen correctamente, necesito usarlo.

¿Alguna idea de cómo puedo obtener el PID del programa java cuando se ejecuta dentro de un comando eval?

+0

¿No '! $ 'Obtiene la línea de comando del último comando? – khachik

+0

Escribí mal en mi descripción. Debería haber sido $! – Milo

Respuesta

28

Su ampersand hace referencia a la línea eval, haciendo que el shell (nivel superior) bifurque a un hijo, el shell hijo a eval el string y a su vez ejecute su programa java como un nieto del shell de nivel superior. Por lo tanto, $! informa el pid del shell secundario, que es el comando más reciente de backgrounded.

mover su lugar, el fondo de la página dentro de su eval:

eval "(java ...) &" 
pid=$! 

Mientras el paréntesis no recibe suficiente complicada para convertirse en un subnivel , lo anterior va a funcionar.

+1

Sí, esto es :) 'EXPR =" java -jar test.jar & "; eval $ EXPR; echo $! 'debería hacer –

+0

FYI: Me di cuenta de que esto funciona desde un terminal, pero si tiene un script con un icono en el escritorio, no funciona. –

Cuestiones relacionadas