2012-12-13 1 views
9

Нужно ли запускать jstack -F как root (на linux), и если да, то почему?Нужно ли запускать jstack -F как root (на linux), и если да, то почему?

При попытке jstack -F мой принадлежит процессов. Я получаю следующее сообщение об ошибке.

Ошибка подключения к процессу: sun.jvm.hotspot.debugger.DebuggerException: Не удается подключить к процессу

jstack -F работает отлично, если я запускаю его с Судом.

ответ

10

Это потому, что jstack -F использует ptrace(2) системный вызов, чтобы попытаться получить доступ к данным виртуальной машины Java, которая терпит неудачу, если вы не имеете права:

$ strace -e all -f jstack -F 26846 
... 
[pid 27653] ptrace(PTRACE_ATTACH, 26846, 0, 0) = -1 EPERM (Operation not permitted) 
... 

из ptrace(2) man:

EPERM The specified process cannot be traced. This could be because the parent 
     has insufficient privileges (the required capability is CAP_SYS_PTRACE); 
     unprivileged processes cannot trace processes that they cannot send 
     signals to or those running set-user-ID/set-group-ID programs, for obvious 
     reasons. Alternatively, the process may already be being traced, or be 
     init(8) (PID 1). 

См. Также capabilities(7). Используя sudo, вы получаете возможности root, которые включают CAP_SYS_PTRACE.