やりたかったこと
tomcat上で動いているwebアプリケーションの不具合調査のためjcmd
コマンドでJVMの情報取得を試みたときに以下のようなエラーがでた。
$ jcmd 27318 GC.heap_dump /var/log/heapdump/heapdump.hprof 27318: com.sun.tools.attach.AttachNotSupportedException: Unable to open socket file: target process not responding or HotSpot VM not loaded at sun.tools.attach.LinuxVirtualMachine.<init>(LinuxVirtualMachine.java:106) at sun.tools.attach.LinuxAttachProvider.attachVirtualMachine(LinuxAttachProvider.java:63) at com.sun.tools.attach.VirtualMachine.attach(VirtualMachine.java:208) at sun.tools.jcmd.JCmd.executeCommandForPid(JCmd.java:147) at sun.tools.jcmd.JCmd.main(JCmd.java:131)
調べたところ、JVMを起動したユーザ以外は拒否されていることが原因らしいので以下のようにログインユーザの変更を試みたができなかった。
$ su - tomcat su: failed to execute /bin/nologin: そのようなファイルやディレクトリはありません
これの解決策について調べたので備忘録として残しておく。
エラーメッセージの意味と原因
ざっくり結論、ユーザによってはbashとかのログインシェルが存在しないケースがあり、
$ cat /etc/passwd
で見てみると、
tomcat:x:88:88:Apache Tomcat:/usr/share/tomcat:/bin/nologin
みたいな感じで ログインシェルが /bin/nologin となっているとログインシェルが存在しないことを意味しているようだ。
解決方法
解決方法は単純、su
コマンドの-s
オプションでログインシェルを指定してやればいいので、
(root@/)$ su -s /bin/bash tomcat bash-4.2$ pwd /root bash-4.2$ id uid=88(tomcat) gid=88(tomcat) groups=88(tomcat)
というようにログインできた。
またもとからやりたかったJVMの情報取得をjcmd
コマンドで確認してみると...
bash-4.2$ jcmd 27318 VM.flags 27318: -XX:....
無事確認することができた。 tomcatについては知見がまったくないのでこれから(必要に応じて)情報を整理していきたい。