logrotateを使用してtcpdumpによって生成されたログを回転させます。

logrotateを使用してtcpdumpによって生成されたログを回転させます。

本番Linuxシステムでは、次の構成を使用してSIPパケットをキャプチャします。

Rotation.confログ:

# Opensips SIP traces 
/var/log/sip.log
{
        rotate 31
        daily
        missingok
        notifempty
        compress
        delaycompress
        sharedscripts
        postrotate
                pkill tcpdump
                /home/ubuntu/log-sip-messages.sh &
        endscript
}

ログ-sip-messages.sh:

#!/bin/sh
tcpdump host 159.63.X.X -s0 -v >> /var/log/sip-159.63.X.X.log

これはUbuntu 11.04サーバーでは正常に機能しますが、Ubuntu 12.10システムはログが回転した時点のタイムスタンプを含むファイルを生成します。これは、新しいファイルの書き込みを開始するためにtcpdumpを再実行する前にpkillが完了していないのと同じです。

実験的に端末で直接実行してみました。

pkill tcpdump && tcpdump -s0 -v udp >> /var/log/sip.log

その後、実行するとps aux|grep tcpdump実行中のプロセスはありません。すでに知っている内容を確認してください。 pkillコマンドは12.10で非同期で実行されます(ただし、11.04で同期的に実行されるか、2番目のコマンドは無効になります)。

ハードドライブの容量がいっぱいになる危険なしに、見やすく読みやすいログファイル(pcapsは不要)にネットワークトラフィックをキャプチャできるようにするにはどうすればよいですか。

答え1

Unix信号は非同期です。システムコールが返されると、killシグナルはプロセスに転送されましたが、プロセスがまだそれに反応していない可能性があります。 11.04では、スケジューラがあるのは幸運です。終了するプロセスにその信号のハンドラがある場合は、終了するまでに任意の時間がかかるか、信号から終了しないかを選択できます。

ロックを使用すると、以前のインスタンスが完了する前にプロセスの新しいインスタンスが起動しないようにすることができます。

また、ランダムにプロセスを終了することはお勧めできませんtcpdump。他のインスタンスが実行されている場合はどうなりますか?代わりに、ロックされたファイルが開いているすべてのプロセスを終了してください。

#!/bin/sh
lockfile=/var/run/log-sip-messages.lock
# Kill all processes that have the lock file open
fuser -k -TERM "$lockfile" >/dev/null 2>/dev/null
(
  # Wait until the lock is released
  flock -s 3
  # Don't let this shell be killed by fuser: wait until tcpdump exits
  trap : TERM
  # Call tcpdump with the lock file open, so that fuser kills it
  tcpdump -s0 -v udp >> /var/log/sip.log
) 3>"$lockfile"

そしてlogrotate内で/home/ubuntu/log-sip-messages.sh実行してください。

答え2

1つのアイデアは、pkill()とバックアップの開始の間に少しの待ち時間を導入することです。まるでハッキングのように感じますが、ここにあります:tcpdump/home/ubuntu/log-sip-messages.sh &

    postrotate
            pkill tcpdump
            sleep 3
            /home/ubuntu/log-sip-messages.sh &
    endscript

答え3

これらすべてが、私がどのツールを使用できるかを調べるためにlogrotateのマンページを掘り下げるようにインスピレーションを与えました。copytruncateログファイルをコピーして切り取っても、ログファイルを作成するプロセスを中断しないことがわかりました。私のテストでは、ログを回転させ、tcpdumpが消去されたファイルに書き込みを続けることを許可することがわかりました。テストプロファイルを使用して1時間ごとのcronjobを一晩実行し、毎時間ログを置き換えます。効率的な:

# Opensips SIP traces 
/var/log/sip.log
{
        rotate 31
        daily
        missingok
        notifempty
        compress
        delaycompress
        sharedscripts
        copytruncate
}

1つの可能性のある欠点は、私が何をしているのかわからない誰かによってtcpdumpプロセスが終了したら、手動でプロセスを再起動する必要がありますが、今はこれで十分です。

もう1つの潜在的な問題は、ログファイルが非常に大きい場合、コピーを作成するためにしばらくのディスク容量が必要になることです。現在のディスク容量は十分ですが十分ではない場合、プロセスは中断される可能性があります。コピーを作成します。

関連情報