В скрипте bash, как получить PID из программы, выполняемой при использовании команды eval? - PullRequest
14 голосов
/ 02 декабря 2010

У меня есть команды в скрипте bash, которые похожи на это:

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

Однако, если я делаю ps $pid, он показывает основной процесс скрипта вместо процесса java-программы.

Он получает правильный процесс, когда я опускаю eval, но для того, чтобы некоторые сложные аргументы работали правильно, мне нужно его использовать.

Любое представление о том, как я могу получить PIDJava-программа, когда она выполняется в команде eval?

1 Ответ

30 голосов
/ 03 декабря 2010

Ваш амперсанд имеет фоновую строку eval, в результате чего оболочка (верхнего уровня) раскручивает дочерний объект, дочерняя оболочка - eval строку и, в свою очередь, запускает вашу Java-программу как внучка верхнего уровня ракушка. Так, $! сообщает pid дочерней оболочки, которая является самой последней фоновой командой.

Вместо этого переместите фон внутри своего eval:

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

Пока скобка не становится достаточно сложной, чтобы стать подоболочкой , вышеописанное будет работать.

...