のーずいだんぷ

主に自分用メモですが、もしかしたら誰かの役に立つかもしれません

tomcatのheapdump取得&apacheやtomcatといったユーザにログインできない問題

やりたかったこと

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については知見がまったくないのでこれから(必要に応じて)情報を整理していきたい。