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実行してください。

おすすめ記事