Внутри bash script, как получить PID из программы, выполняемой при использовании команды eval?
У меня есть команды в bash script, которые похожи на следующие:
eval "( java -classpath ./ $classname ${arguments[@]} $redirection_options $file )" &
pid=$!
Однако, если я делаю a ps $pid
, он показывает основной процесс script вместо процесса java-программы.
Он получает правильный процесс, когда я опускаю eval, но для правильной работы некоторых из сложных аргументов мне нужно его использовать.
Любая идея о том, как я могу получить PID программы java, когда она выполняется в команде eval?
Ответы
Ответ 1
Ваш амперсанд ссылается на строку eval
, заставляя оболочку (верхнего уровня) разветвлять дочерний элемент, дочернюю оболочку на eval
строку и, в свою очередь, запускать вашу Java-программу в качестве внука верхнего уровня оболочка. Таким образом, $!
сообщает pid дочерней оболочки, которая является последней командой с фоном.
Вместо этого переместите фоном внутри своего eval:
eval "(java ...) &"
pid=$!
Пока скобка не становится достаточно сложной, чтобы стать подоболочкой, это будет работать.