Kill
使用 logrotate 輪換從 tcpdump 生成的日誌
在一個生產 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