프로덕션 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에서 동기식으로 실행되거나 두 번째 명령이 무효화됩니다).
하드 드라이브 공간을 가득 채울 위험 없이 보기 좋고 읽기 쉬운 로그 파일(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
한 가지 아이디어는 pkill
()와 백업 시작 사이에 약간의 대기 시간을 도입하는 것입니다. 마치 해킹처럼 느껴지지만, 여기에 있습니다:tcpdump
/home/ubuntu/log-sip-messages.sh &
postrotate
pkill tcpdump
sleep 3
/home/ubuntu/log-sip-messages.sh &
endscript
답변3
이 모든 것이 제가 어떤 도구를 사용할 수 있는지 알아보기 위해 logrotate 맨페이지를 파헤치도록 영감을 주었습니다. copytruncate
로그 파일을 복사한 다음 잘라내지만 로그 파일을 작성하는 프로세스를 중단하지는 않는 것으로 나타났습니다 . 내 테스트에서는 로그를 회전하고 tcpdump가 지워진 파일에 계속 쓸 수 있도록 허용하는 것으로 나타났습니다. 테스트 프로필을 사용하여 시간별 cronjob을 밤새 실행하여 매 시간마다 로그를 교체합니다. 효율적인:
# Opensips SIP traces
/var/log/sip.log
{
rotate 31
daily
missingok
notifempty
compress
delaycompress
sharedscripts
copytruncate
}
한 가지 가능한 단점은 내가 무엇을 하고 있는지 모르는 누군가에 의해 tcpdump 프로세스가 종료되면 수동으로 프로세스를 다시 시작해야 하지만 지금은 이것으로 충분하다는 것입니다.
또 다른 잠재적인 문제는 로그 파일이 매우 큰 경우 복사본을 만드는 데 잠시 많은 디스크 공간이 필요할 수 있다는 것입니다. 현재 디스크 공간은 충분하지만 충분하지 않으면 프로세스가 중단될 수 있습니다. 사본을 만드세요.