java jvm jstack

java - jstack-archivo conocido no es seguro



jstack linux (10)

Estoy ejecutando tomcat 5.5 en x86_64 CentOS 5.7 utilizando Oracle Java 1.6.0 de 32 bits.

El proceso de JVM utilizado por tomcat tiene 6421 pid. Tomcat está funcionando bien.

Cuando se ejecuta jstack falla con:

[root@mybox ~]# jstack 6421 6421: well-known file is not secure

Para obtener un resultado razonable, necesito usar la opción de fuerza:

[root@mybox ~]# jstack -F 6421 Attaching to process ID 6421, please wait... Debugger attached successfully. Server compiler detected. JVM version is 17.0-b16 Deadlock Detection: No deadlocks found. (...)

Las preguntas son:

  1. ¿Qué significa el mensaje de error "archivo conocido no es seguro" ?
  2. ¿Cuál es el archivo "conocido"?
  3. ¿Por qué / cuándo el comando jstack no funciona sin una opción de fuerza?

Gracias por adelantado.


Además de ejecutar con el mismo usuario, asegúrese de que la identificación del grupo del usuario que ejecuta jstack / jmap también sea la misma desde el proceso.

Eche un vistazo al código fuente que verifica el permiso de archivo (línea 347). Podemos ver que la función que obtiene la identificación del grupo no es una matriz, por lo que podría ser posible que el usuario tenga otros grupos, lo que inició el proceso.

Puede que tenga que cambiar el grupo primario del usuario:

#usermod -g group -G user user


Este es el único trazador de líneas que uso para asegurarme de que siempre estoy usando los permisos de usuario correctos:

proc="my-process-name"; pid=`pgrep -f "${proc}"`; sudo -u "#`ps axo uid,pid | grep "${pid}" | tr -s " " | cut -f2 -d" "`" /usr/bin/jstack -l "${pid}" > /mnt/dumps/"${proc}"-`date +%s`.txt


Esto probablemente se deba al archivo en / tmp utilizado para comunicarse con el proceso que tiene permisos diferentes a los que obtiene el jstack . El archivo en cuestión es / tmp / hsperfdata_ $ USER / $ PID.

No sé por qué funciona con -F, ya que la página de manual solo dice "Forzar un volcado de pila cuando ''jstack [-l] pid'' no responde".


Me estaba dando el mismo error al ejecutar:

watch -n .5 "jstack 26259"

Haciendo como sudo funciona:

sudo watch -n .5 "jstack 26259"


Me gustaría agregar que es posible que necesite especificar su directorio / tmp por la opción -J, ya que no todas las aplicaciones usan la predeterminada.

jstack -J-Djava.io.tmpdir=PATH -l PID


Para usar con éxito el jstack, debe ejecutarlo con el mismo usuario que el proceso.


Probablemente la forma más fácil es:

vea al propietario del proceso por ps -ef | grep "nombre del proceso"

luego cambie a ese usuario y ejecute el comando.

jcmd PID GC.run o cualquier otra utilidad java

Una cosa que noté es que nadie discutió aquí; también necesita establecer la variable JAVA_HOME. mira esto por echo $ JAVA_HOME


Si no quiere preocuparse por el usuario y puede funcionar como root y está bien matar el proceso, puede usar este último recurso:

kill -s SIGQUIT $PID

Esto escribirá el volcado de subprocesos en el registro de la consola, por ejemplo, en el caso de Tomcat, que requerirá grepping para "Full Thread" que es el comienzo del volcado de subprocesos en logs / catalina.out y luego obtener el archivo tdump como:

DUMP_IDX=`grep -n ''Full thread'' logs/catalina.out | tail -1 | cut -d'':'' -f1` sed -n $DUMP_IDX,1000000000000000000p logs/catalina.out > jstack-kill-thread-dump-0309.tdump


Tuve este problema cuando traté de ejecutar jstack como root .

Una vez que cambié a otro usuario, funcionó de inmediato.


cuando se usa -F , el jvm se congelará .

Si puede encontrar el file: /tmp/hsperfdata_$USER/$PID . Solo intente cambiar al $USER , y luego al exec jstack . Se está ejecutando con " raíz ", pero ese proceso puede no pertenecer a la raíz.

si $USER no tiene un shell de inicio de sesión (es decir, usuarios de daemon) y, por lo tanto, no puede cambiar a ese usuario, puede sudo -u $USER jstack $PID utilizando sudo -u $USER jstack $PID