コアダンプの数だけ強くなれるよ

見習いエンジニアの備忘log

netstat -s コマンドっぽい表示をシェルで実現する

最近のLinuxはデフォルトではnet-toolsのコマンド(ifconfig、netstat等)はインストールされておらず、代わりにiproute2(ip、ss等)の使用を推奨していたりする。多くの先人の方がnet-toolsからiproute2へ移行する人向けにコマンド対応の一覧まとめて展開してくれているので大抵のコマンドは困らないで済む(ありがたや)。

orebibou.com

対応するコマンドがない...


だけど、1つだけどんなに調べても対応するコマンドが見つからない。

それは、ネットワーク統計を表示するnetstat -s だ。
(いや、あるよって方がいたら教えてください)


先人の方々がまとめた記事を見ると、"ss -s"を代替コマンドとしている方が多いのだが実際のコマンド結果を見ると欲しいのはソレじゃない感スゴイ。(私だけ?)

netstat -sの表示
[user@localhost ~]$ netstat -s
Ip:
    6027 total packets received
    0 forwarded
    0 incoming packets discarded
    5464 incoming packets delivered
    2966 requests sent out
Icmp:
    0 ICMP messages received
    0 input ICMP message failed.
    ICMP input histogram:
    0 ICMP messages sent
    0 ICMP messages failed
    ICMP output histogram:
Tcp:
    26 active connections openings
    1 passive connection openings
    0 failed connection attempts
    0 connection resets received
    1 connections established
    5432 segments received
    3024 segments send out
    1 segments retransmited
    0 bad segments received.
    0 resets sent
Udp:
    32 packets received
    0 packets to unknown port received.
    0 packet receive errors
    32 packets sent
    0 receive buffer errors
    0 send buffer errors
UdpLite:
TcpExt:
    24 TCP sockets finished time wait in fast timer
    39 delayed acks sent
    1 packets directly queued to recvmsg prequeue.
    1547 packet headers predicted
    1601 acknowledgments not containing data payload received
    1243 predicted acknowledgments
    1 congestion windows recovered without slow start after partial ack
    1 other TCP timeouts
    TCPRcvCoalesce: 2
    TCPSynRetrans: 1
    TCPOrigDataSent: 2843
IpExt:
    InNoRoutes: 1
    InBcastPkts: 562
    InOctets: 603244
    OutOctets: 699661
    InBcastOctets: 103309
    InNoECTPkts: 6032

ss -sの結果
[user@localhost ~]$ ss -s
Total: 184 (kernel 0)
TCP:   8 (estab 1, closed 0, orphaned 0, synrecv 0, timewait 0/0), ports 0

Transport Total     IP        IPv6
*         0         -         -
RAW       3         0         3
UDP       3         2         1
TCP       8         4         4
INET      14        6         8
FRAG      0         0         0


これは、いくらなんでも端折りではないだろうか...
そもそも、ss -s はヘルプをみるとソケットのサマリーと書いてあってネットワークの統計とは言ってない。

無ければ作る


net-toolsをインストールすれば済む話ですが、それは何だか負けた気がするので自分で代わりのコマンド(シェルスクリプト)を作ってみた。

netstat-s.sh
[user@localhost ~]$ cat netstat-s.sh
#!/bin/sh

TMPFILE=`mktemp`
INDENT='    '

trap 'rm -f $TMPFILE;exit' 2

function SHAPING_PSTAT () {

    KINDS=(`cut -d ":" -f1 $1 | awk '!tmp[$0]++'`)

    for entry in `seq 1 ${#KINDS[@]}`
    do
        ENT=(`grep "${KINDS[$entry-1]}:" $1 | sed -e s/"${KINDS[$entry-1]}:"//g | head -n 1`)
        VAL=(`grep "${KINDS[$entry-1]}:" $1 | sed -e s/"${KINDS[$entry-1]}:"//g | tail -n 1`)

        printf "${KINDS[$entry-1]}:\n"
        for index in `seq 1 ${#ENT[@]}`
        do
            printf "$INDENT%-30s%-20d\n" ${ENT[$index-1]} ${VAL[$index-1]}
        done
    done

}

cat /proc/net/snmp > $TMPFILE
SHAPING_PSTAT $TMPFILE

cat /proc/net/netstat > $TMPFILE
SHAPING_PSTAT $TMPFILE

rm -f $TMPFILE

表示結果
[user@localhost ~]$ ./netstat-s.sh
Ip:
    Forwarding                    2
    DefaultTTL                    64
    InReceives                    6339
    InHdrErrors                   0
    InAddrErrors                  0
    ForwDatagrams                 0
    InUnknownProtos               0
    InDiscards                    0
    InDelivers                    5613
    OutRequests                   3052
    OutDiscards                   0
    OutNoRoutes                   0
    ReasmTimeout                  0
    ReasmReqds                    0
    ReasmOKs                      0
    ReasmFails                    0
    FragOKs                       0
    FragFails                     0
    FragCreates                   0
Icmp:
    InMsgs                        0
    InErrors                      0
    InCsumErrors                  0
    InDestUnreachs                0
    InTimeExcds                   0
    InParmProbs                   0
    InSrcQuenchs                  0
    InRedirects                   0
    InEchos                       0
    InEchoReps                    0
    InTimestamps                  0
    InTimestampReps               0
    InAddrMasks                   0
    InAddrMaskReps                0
    OutMsgs                       0
    OutErrors                     0
    OutDestUnreachs               0
    OutTimeExcds                  0
    OutParmProbs                  0
    OutSrcQuenchs                 0
    OutRedirects                  0
    OutEchos                      0
    OutEchoReps                   0
    OutTimestamps                 0
    OutTimestampReps              0
    OutAddrMasks                  0
    OutAddrMaskReps               0
Tcp:
    RtoAlgorithm                  1
    RtoMin                        200
    RtoMax                        120000
    MaxConn                       -1
    ActiveOpens                   26
    PassiveOpens                  1
    AttemptFails                  0
    EstabResets                   0
    CurrEstab                     1
    InSegs                        5581
    OutSegs                       3112
    RetransSegs                   1
    InErrs                        0
    OutRsts                       0
    InCsumErrors                  0
Udp:
    InDatagrams                   32
    NoPorts                       0
    InErrors                      0
    OutDatagrams                  32
    RcvbufErrors                  0
    SndbufErrors                  0
    InCsumErrors                  0
UdpLite:
    InDatagrams                   0
    NoPorts                       0
    InErrors                      0
    OutDatagrams                  0
    RcvbufErrors                  0
    SndbufErrors                  0
    InCsumErrors                  0
TcpExt:
    SyncookiesSent                0
    SyncookiesRecv                0
    SyncookiesFailed              0
    EmbryonicRsts                 0
    PruneCalled                   0
    RcvPruned                     0
    OfoPruned                     0
    OutOfWindowIcmps              0
    LockDroppedIcmps              0
    ArpFilter                     0
    TW                            24
    TWRecycled                    0
    TWKilled                      0
    PAWSPassive                   0
    PAWSActive                    0
    PAWSEstab                     0
    DelayedACKs                   43
    DelayedACKLocked              1
    DelayedACKLost                0
    ListenOverflows               0
    ListenDrops                   0
    TCPPrequeued                  1
    TCPDirectCopyFromBacklog      0
    TCPDirectCopyFromPrequeue     0
    TCPPrequeueDropped            0
    TCPHPHits                     1599
    TCPHPHitsToUser               0
    TCPPureAcks                   1638
    TCPHPAcks                     1288
    TCPRenoRecovery               0
    TCPSackRecovery               0
    TCPSACKReneging               0
    TCPFACKReorder                0
    TCPSACKReorder                0
    TCPRenoReorder                0
    TCPTSReorder                  0
    TCPFullUndo                   0
    TCPPartialUndo                0
    TCPDSACKUndo                  0
    TCPLossUndo                   1
    TCPLostRetransmit             0
    TCPRenoFailures               0
    TCPSackFailures               0
    TCPLossFailures               0
    TCPFastRetrans                0
    TCPForwardRetrans             0
    TCPSlowStartRetrans           0
    TCPTimeouts                   1
    TCPLossProbes                 0
    TCPLossProbeRecovery          0
    TCPRenoRecoveryFail           0
    TCPSackRecoveryFail           0
    TCPSchedulerFailed            0
    TCPRcvCollapsed               0
    TCPDSACKOldSent               0
    TCPDSACKOfoSent               0
    TCPDSACKRecv                  0
    TCPDSACKOfoRecv               0
    TCPAbortOnData                0
    TCPAbortOnClose               0
    TCPAbortOnMemory              0
    TCPAbortOnTimeout             0
    TCPAbortOnLinger              0
    TCPAbortFailed                0
    TCPMemoryPressures            0
    TCPSACKDiscard                0
    TCPDSACKIgnoredOld            0
    TCPDSACKIgnoredNoUndo         0
    TCPSpuriousRTOs               0
    TCPMD5NotFound                0
    TCPMD5Unexpected              0
    TCPSackShifted                0
    TCPSackMerged                 0
    TCPSackShiftFallback          0
    TCPBacklogDrop                0
    TCPMinTTLDrop                 0
    TCPDeferAcceptDrop            0
    IPReversePathFilter           0
    TCPTimeWaitOverflow           0
    TCPReqQFullDoCookies          0
    TCPReqQFullDrop               0
    TCPRetransFail                0
    TCPRcvCoalesce                2
    TCPOFOQueue                   0
    TCPOFODrop                    0
    TCPOFOMerge                   0
    TCPChallengeACK               0
    TCPSYNChallenge               0
    TCPFastOpenActive             0
    TCPFastOpenActiveFail         0
    TCPFastOpenPassive            0
    TCPFastOpenPassiveFail        0
    TCPFastOpenListenOverflow     0
    TCPFastOpenCookieReqd         0
    TCPSpuriousRtxHostQueues      0
    BusyPollRxPackets             0
    TCPAutoCorking                0
    TCPFromZeroWindowAdv          0
    TCPToZeroWindowAdv            0
    TCPWantZeroWindowAdv          0
    TCPSynRetrans                 1
    TCPOrigDataSent               2925
    TCPHystartTrainDetect         0
    TCPHystartTrainCwnd           0
    TCPHystartDelayDetect         0
    TCPHystartDelayCwnd           0
    TCPACKSkippedSynRecv          0
    TCPACKSkippedPAWS             0
    TCPACKSkippedSeq              0
    TCPACKSkippedFinWait2         0
    TCPACKSkippedTimeWait         0
    TCPACKSkippedChallenge        0
IpExt:
    InNoRoutes                    1
    InTruncatedPkts               0
    InMcastPkts                   0
    OutMcastPkts                  0
    InBcastPkts                   725
    OutBcastPkts                  0
    InOctets                      647580
    OutOctets                     720269
    InMcastOctets                 0
    OutMcastOctets                0
    InBcastOctets                 133265
    OutBcastOctets                0
    InCsumErrors                  0
    InNoECTPkts                   6355
    InECT1Pkts                    0
    InECT0Pkts                    0
    InCEPkts                      0




単に/proc/net/snmpと/proc/net/netstatを整形して表示するだけ。
IPv6系は/proc/net/snmp6を直接catで覗けばよい。



[参考]
逆引きシェルスクリプト/スペース区切りの文字列を配列に格納する方法 - Linuxと過ごす
ソートしないで重複行を削除する - Qiita