Voici mon problème : j'ai un script shell qui configure une jvm pour le lancement de tomcat en assignant des paramètres à la variable JAVA_OPTS.
Je souhaiterais indiquer à ma jvm de s'arrêter lors d'une "OutOfMemoryException", pour ça la jvm de sun fournit le paramètre "-XX:OnOutOfMemoryError=" auquel on fournit la commande à exécuter.
Sauf que dans mon cas, Bash échappe de façon incongrue mes paramètres, dans mon script j'ai :
[...]
export JAVA_OPTS="$JAVA_OPTS -XX:+DisableExplicitGC"
export JAVA_OPTS="$JAVA_OPTS -XX:OnOutOfMemoryError=\"kill -9 %p\""
[...]
et la jvm refuse de démarrer :
Unrecognized option: -9
Could not create the Java virtual machine.
J'ai utilisé "set -x" pour voir ce qui était exécuté et je m'aperçois que Bash échappe n'importe comment une partie de la variable "JAVA_OPTS" :
... -XX:+DisableExplicitGC '-XX:OnOutOfMemoryError="kill' -9 '%p"' -D...
Comme on peux le voir il ajoute des simples quotes au début jusqu'au premier espace. Du coup ma commande "kill -9 %p" qui devait être un seul paramètre est interprété comme 3 par java.
Quelqu'un aurait-il une idée du pourquoi du comment?
Merci d'avance.
# chez moi ça marche
Posté par goeb . Évalué à 2.
export JAVA_OPTS="$JAVA_OPTS -XX:OnOutOfMemoryError=\"kill -9 %p\""
echo $JAVA_OPTS
-XX:OnOutOfMemoryError="kill -9 %p"
[^] # Re: chez moi ça marche
Posté par Gabriel MAGNIEZ (site web personnel) . Évalué à 2.
$ export JAVA_OPTS="$JAVA_OPTS -XX:+DisableExplicitGC"
$ export JAVA_OPTS="$JAVA_OPTS -XX:OnOutOfMemoryError=\"kill -9 %p\""
$ echo $JAVA_OPTS
-XX:+DisableExplicitGC -XX:OnOutOfMemoryError="kill -9 %p"
$ set -x
$ echo $JAVA_OPTS
+ echo -XX:+DisableExplicitGC '-XX:OnOutOfMemoryError="kill' -9 '%p"'
# normal...
Posté par Bruno Muller . Évalué à 3.
$ v="a:b c"
$ BAK=$IFS ; IFS=: ; ls $v ; IFS=$BAK
ls: impossible d'accéder à a: Aucun fichier ou dossier de ce type
ls: impossible d'accéder à b c: Aucun fichier ou dossier de ce type
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.