Kill

使用 logrotate 輪換從 tcpdump 生成的日誌

  • August 31, 2013

在一個生產 linux 機器上,我使用以下配置擷取 SIP 數據包:

logrotate.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
}

log-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 機器上,這只會在日誌輪換時生成一個帶有時間戳的文件。就好像 pkill 在再次執行 tcpdump 以開始寫入新文件之前沒有完成。

我試過直接從終端執行它作為實驗:

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

然後當我執行時ps aux|grep tcpdump,沒有程序在執行,確認我已經知道的…… pkill 命令在 12.10 上非同步執行(但要麼在 11.04 上同步,要麼只是擊敗第二個命令)

我怎樣才能完成這項工作,以便我可以在一個漂亮、可讀的日誌文件(我不需要 pcaps)中擷取網路流量,而不會冒著填滿我的硬碟空間的風險?

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只執行。

一種想法是在( )pkill和開始備份之間引入一些等待時間。這感覺就像一個 hack,確實是這樣,但是是這樣的:tcpdump``/home/ubuntu/log-sip-messages.sh &

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

引用自:https://unix.stackexchange.com/questions/88789