port <-> pid for Solaris2008年09月06日 03時24分38秒

netstat でプロセス特定できないの? in Solaris でどのプロセスが、どのポートを利用しているのかを調べるのに、pfiles が使える。

pfiles は基本的にプロセスのファイルディスクリプタを調べるコマンドの様だ。


% pfiles 20119
20119:  bash
  Current rlimit: 256 file descriptors
   0: S_IFCHR mode:0620 dev:118,112 ino:207660 uid:2111 gid:7 rdev:24,919
      O_RDWR
   1: S_IFCHR mode:0620 dev:118,112 ino:207660 uid:2111 gid:7 rdev:24,919
      O_RDWR
   2: S_IFCHR mode:0620 dev:118,112 ino:207660 uid:2111 gid:7 rdev:24,919
      O_RDWR
   3: S_IFDOOR mode:0444 dev:315,0 ino:42609 uid:0 gid:0 size:0
      O_RDONLY|O_LARGEFILE FD_CLOEXEC  door to nscd[335]
 255: S_IFCHR mode:0620 dev:118,112 ino:207660 uid:2111 gid:7 rdev:24,919
      O_RDWR FD_CLOEXEC

ネットワークに接続されていると、以下のような出力がある。


10557:  ...
  Current rlimit: 1024 file descriptors
,,,
   5: S_IFSOCK mode:0666 dev:310,0 ino:47334 uid:0 gid:0 size:0
      O_RDWR
        sockname: AF_INET 0.0.0.0  port: 58266
   6: S_IFSOCK mode:0666 dev:310,0 ino:24707 uid:0 gid:0 size:0
      O_RDWR FD_CLOEXEC
        sockname: AF_INET 127.0.0.1  port: 58270
        peername: AF_INET 127.0.0.1  port: 16001
   7: S_IFSOCK mode:0666 dev:310,0 ino:24707 uid:0 gid:0 size:0
      O_RDWR FD_CLOEXEC
        sockname: AF_INET 127.0.0.1  port: 58273

システムの問題点を探している時に、ポート番号とプロセス番号の対応が判るのは、強力な助けになる。


$ sh -c 'for pid in `ps -aeo pid | tail +1`; do pfiles $pid; done'

これで全てのプロセスが表示されるので、less に渡して使っている。