2010-01-22 2 views
1

Я переживаю странную проблему последние пару дней при написании сценария оболочки, который выполняет Java (начиная с JBoss AS). У меня есть переменная JAVA_OPTS, которую я создаю, и, наконец, переходя к команде «java». Когда я жестко кодирую значения в JAVA_OPTS, а не используя расширение переменной, процесс java выполняется нормально. Когда я использую расширение переменной, я получаю ошибки из исполняемого файла java. Вот соответствующие части сценария:Расширение переменной Bash приводит к разрыву командной строки Java

SERVER="-server" 
MEM_OPTS="-Xms512m -Xmx1024m" 

case "$1" in 
start) 
    java "$SERVER" "$MEM_OPTS" $JAVA_OPTS \ 
    -classpath "${JBOSS_CLASSPATH}" \ 
    -Dorg.jboss.resolver.warning=true \ 
    -Dsun.rmi.dgc.client.gcInterval=3600000 \ 
    -Dsun.rmi.dgc.server.gcInterval=3600000 \ 
    -Djboss.server.name=${SERVICE_NAME} \ 
    -Djboss.server.base.dir=`dirname ${EC_APP_HOME}` \ 
    -Djboss.server.base.url=file://`dirname ${EC_APP_HOME}` \ 
    -Djboss.server.home.dir=${EC_APP_HOME} \ 
    -Djboss.server.home.url=file://${EC_APP_HOME} \ 
    org.jboss.Main >> out.log 2>&1 & 

Выполнение этого дает следующее:

Invalid initial heap size: -Xms512m -Xmx1024m 
Could not create the Java virtual machine. 

Однако, когда я удалить расширение переменной следующим образом:

java "$SERVER" -Xms512m -Xmx1024m $JAVA_OPTS \ 

Java не выполняет никаких проблем , В стороне, когда я включаю «-сервер» в MEM_OPTS var, я получаю сообщение об ошибке «непризнанная опция».

Очевидно, что есть что-то с переменным расширением. У меня есть hexdump'd сценарий, и убедитесь, что в строке нет лишних символов, и подтвердил, что использую окончания строки Unix. Я также воспроизвел проблему на двух разных Linux-машинах, хотя оба они работают с одной и той же версией ubuntu (один 32-битный, другой 64-битный).

EDIT: Я получаю тот же результат со всеми формами подстановки переменных: $ MEM_OPTS, $ {MEM_OPTS}, "$ {MEM_OPTS}"

Любые идеи?

+0

попробуйте eval java ....? – ghostdog74

+0

Какая версия Bash? –

ответ

2

Моей ошибки - я садился IFS к "\ п" только в сценарии я соерсед в, functions.sh. Я никогда не возвращал IFS в «\ n \ t», поэтому переменные не разбивались на пробелы.

Спасибо за ответы!

+1

+1, так как это «актуальное» решение, хотя другие были полезны. – paxdiablo

7

Когда вы используете "$MEM_OPTS", вы передаете -Xms512m -Xmx1024m в качестве единственного варианта.

Попробуйте вместо этого:

java "$SERVER" $MEM_OPTS $JAVA_OPTS \ 

хорошее руководство для подстановки переменной и со ссылкой на примеры: http://tldp.org/LDP/abs/html/varsubn.html

+0

Спасибо, что ответили. Я получаю тот же результат без кавычек. Я обновил исходный вопрос, разъяснив это. – purecharger

2

Я не 100% уверен, семантике цитаты, но "$MEM_OPTS" может создать единый аргумент "-Xms512m -Xmx1024m", тогда как JVM необходимо увидеть два отдельных аргумента. Можете ли вы попробовать без кавычек?

java $SERVER $MEM_OPTS $JAVA_OPTS 
2

думает, он должен работать, если кавычки вокруг $ MEM_OPTS удаляется, так как котировки говорят Башу передать развернутое содержимое в виде одного маркеров аргумента execv()

1

Она должна быть простым вопросом изменение:

java "$SERVER" "$MEM_OPTS" $JAVA_OPTS \ 

к:

java "$SERVER" $MEM_OPTS $JAVA_OPTS \ 

так, что параметры памяти передаются как два аргументы.

Но, поскольку вы говорите, что не работает (?), Попробуйте следующее.

A) Создать скрипт fakejava.sh, содержащий:

#!/usr/bin/bash 
echo $# 
while [[ $# -ne 0 ]] ; do 
    echo " [$1]" 
done 

(возможно, потребуется изменить эту первую строку, если ваш bash где-то еще: используйте which bash, чтобы выяснить, где).

B) Установите его разрешения правильно:

chmod 700 fakejava.sh 

C) Заменить весь java команду с:

./fakejava.sh "$SERVER" $MEM_OPTS $JAVA_OPTS xx 

и посмотреть, сколько аргументов есть на самом деле. Я получаю:

5 
    [-server] 
    [-arg1] 
    [-arg2] 
    [none] 
    [xx] 

от управляющего сценария:

#!/usr/bin/bash 
JAVA_OPTS="none" 
SERVER="-server" 
MEM_OPTS="-arg1 -arg2" 
./fakejava.sh "$SERVER" $MEM_OPTS $JAVA_OPTS xx 
+0

Я понял свою ошибку - не сбросил переменную IFS. Этот тест помог бы показать это. Благодаря! – purecharger

+0

@purecharger, вы, вероятно, должны принять свой собственный ответ (так как это фактическое исправление) и проголосовать за все, что помогло. Думаю, вам придется подождать 24 часа, прежде чем принять свой собственный ответ. Привет, и рад, что ты разобрался. – paxdiablo

+0

Yup, нужно еще 10 часов. Спасибо! – purecharger

Смежные вопросы