scramble cadenza

技術ネタのガラクタ置き場

port やプロセスの状況を確認するコマンドレシピ集

イントロ

毎回忘れてググるやつをまとめました。
巷では Advent Calendar などが流行っている時期ですが、そんなことはいざ知れず、空気を読まずに普通に投稿します。

ただの netstat, lsof コマンドの使い方をまとめたもの。

指定した port 番号から、それを使用している process を特定する

port -> process の確認
lsof は環境によってはデフォルトで入ってなかったりするので、その場合は netstat を使う。
(こういうケースがあるから覚えにくい)

lsof -i:{port}

$ lsof -i:80
COMMAND   PID     USER   FD   TYPE            DEVICE SIZE/OFF NODE NAME
ruby    41533 argerich   23u  IPv6 0xabbad0913f4fe95      0t0  TCP localhost:hbci (LISTEN)
ruby    41533 argerich   24u  IPv4 0xabbad09116bd095      0t0  TCP localhost:hbci (LISTEN)

netstat -anp | grep LISTEN (linux only)

(gentooman netstat で確認)

  • -a--all の略で、全ての socket を表示
  • -n--numeric の略で、host や port を数字で表示
  • -p--program で、PID や実行プログラム名を表示する
  • (-t--tcp の略で、tcp で絞り込む)
  • (-u--udp の略で、udp で絞り込む)
2614a2595864 app # netstat -anpt | grep LISTEN
tcp        0      0 127.0.0.11:43731        0.0.0.0:*               LISTEN      -

指定の process から、どの port を使用しているかを確認する

process -> port の確認

lsof -n -P -p {pid} | grep LISTEN

  • -n は network や host の名前解決を行わない
  • -P は port 名の変換を行わず、数字で表示する
  • -p は pid で絞り込む
% lsof -P -n -p 206 | grep LISTEN
ruby    206 argerich   22u   IPv6 0xabbad0913f49e75        0t0      TCP [::1]:3000 (LISTEN)
ruby    206 argerich   23u   IPv4 0xabbad09148b2cb5        0t0      TCP 127.0.0.1:3000 

指定の process が、どのファイルを開いているかを確認する

process -> fd の確認

lsof -p {port}

$ lsof -p 41533
COMMAND   PID     USER   FD    TYPE            DEVICE  SIZE/OFF     NODE NAME
ruby    41533 argerich  cwd     DIR               1,4       952 15380291 /Users/argerich/dev/rails-showcase
ruby    41533 argerich  txt     REG               1,4   3245556 24795779 /Users/argerich/.rbenv/versions/2.4.1/bin/ruby
ruby    41533 argerich  txt     REG               1,4    279856 27355077 /System/Library/CoreServices/Encodings/libJapaneseConverter.dylib
ruby    41533 argerich  txt     REG               1,4     13280 24796569 
...
ruby    41533 argerich    4    PIPE 0xabbad090c986855     16384          ->0xabbad0907820f15
ruby    41533 argerich    5    PIPE 0xabbad090c986615     16384          ->0xabbad090c985f55
ruby    41533 argerich    6    PIPE 0xabbad090c985f55     16384          ->0xabbad090c986615
ruby    41533 argerich    7w    REG               1,4  80408171 15423000 /Users/argerich/dev/rails-showcase/log/development.log
ruby    41533 argerich    8    PIPE 0xabbad0907820e55     16384          ->0xabbad090c985e95
ruby    41533 argerich    9u   IPv4 0xabbad0906b17285       0t0      TCP 192.168.0.3:60774->54.239.96.26:https (CLOSED)
ruby    41533 argerich   10u   unix 0xabbad09122853dd       0t0          ->0xabbad090712d18d
ruby    41533 argerich   11    PIPE 0xabbad09078206d5     16384          ->0xabbad090c9863d5
ruby    41533 argerich   12u  systm                         0t0

開いているファイルから、プロセスを確認する

fd -> process の確認

lsof

lsof log/development.log
COMMAND PID     USER   FD   TYPE DEVICE   SIZE/OFF     NODE NAME
ruby    206 argerich    7w   REG    1,4 2037258433 26785609 log/development.log

fuser -u

  • -u--user の略で、user 名を付与する
  • -v--verbose の略で、詳細を表示する(linux 限定)
% fuser -u log/development.log
log/development.log: 71941(argerich)
4b43c8ebf178 app # fuser -vu /bin/bash
                     USER        PID ACCESS COMMAND
/bin/bash:           root          1 ....m (root)bash

ローカルで待ち受けている port 一覧

nmap -v

  • -v は verbose level を上げる。詳細を表示する、と思って良いのかも
    • -vv もある
  • host 部分の指定は localhost 以外にも当然可能
    • 悪用厳禁
% nmap -v localhost

Starting Nmap 7.12 ( https://nmap.org ) at 2017-12-13 21:44 JST
Initiating Ping Scan at 21:44
Scanning localhost (127.0.0.1) [2 ports]
Completed Ping Scan at 21:44, 0.00s elapsed (1 total hosts)
Initiating Connect Scan at 21:44
Scanning localhost (127.0.0.1) [1000 ports]
Discovered open port 8080/tcp on 127.0.0.1
Discovered open port 143/tcp on 127.0.0.1
Discovered open port 80/tcp on 127.0.0.1
Discovered open port 110/tcp on 127.0.0.1
Discovered open port 3000/tcp on 127.0.0.1
Discovered open port 3001/tcp on 127.0.0.1
Discovered open port 3128/tcp on 127.0.0.1
Discovered open port 5432/tcp on 127.0.0.1
LOG:  could not receive data from client: Connection reset by peer
LOG:  incomplete startup packet
Completed Connect Scan at 21:44, 5.59s elapsed (1000 total ports)
Nmap scan report for localhost (127.0.0.1)
Host is up (0.00038s latency).
Other addresses for localhost (not scanned): ::1
Not shown: 963 closed ports, 29 filtered ports
PORT     STATE SERVICE
80/tcp   open  http
110/tcp  open  pop3
143/tcp  open  imap
3000/tcp open  ppp
3001/tcp open  nessus
3128/tcp open  squid-http
5432/tcp open  postgresql
8080/tcp open  http-proxy

Read data files from: /Users/argerich/.homebrew/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 5.63 seconds

netstat -ant | grep LISTEN | grep "127.0.0.1"

一覧を出して grep してるだけ。
(nmap と結果が違っている理由がよくわからないけど)

% netstat -ant | grep LISTEN | grep "127.0.0.1"
tcp4       0      0  127.0.0.1.3000         *.*                    LISTEN
tcp4       0      0  127.0.0.1.5432         *.*                    LISTEN
tcp4       0      0  127.0.0.1.17603        *.*                    LISTEN
tcp4       0      0  127.0.0.1.17600        *.*                    LISTEN
tcp4       0      0  127.0.0.1.6263         *.*                    LISTEN
tcp4       0      0  127.0.0.1.6258         *.*                    LISTEN
tcp4       0      0  127.0.0.1.6379         *.*                    LISTEN

指定の port で process が待ち受けてるかどうか

nc -vz {host} {port}

localhost の部分は、別の host にも置き換えられるので、外部から叩いて確認する事もできる

% nc -vz localhost 3306
found 0 associations
found 1 connections:
     1: flags=82<CONNECTED,PREFERRED>
        outif lo0
        src ::1 port 61086
        dst ::1 port 3306
        rank info not available
        TCP aux info available

Connection to localhost port 3306 [tcp/mysql] succeeded!
% nc -vz localhost 1119
nc: connectx to localhost port 1119 (tcp) failed: Connection refused
nc: connectx to localhost port 1119 (tcp) failed: Connection refused

参考