abrt가 충돌하지 않은 프로세스의 로그 출력을 인수하는 이유는 무엇입니까?

abrt가 충돌하지 않은 프로세스의 로그 출력을 인수하는 이유는 무엇입니까?

간결한 버전:

  1. syslog에 (상세하게) 기록하는 장기 실행 프로세스(웹 프록시)가 있습니다.
  2. 무엇나쁜 일이 일어나면 갑자기 개입해어떻게든
  3. 프로세스가 계속 실행됩니다...
  4. ...그러나 syslog에 대한 모든 로그 메시지는 이제 "xfcproxy[1234]:" 대신 "abrt:"로 표시됩니다.
  5. 이유를 아시나요?

긴 버전:

이는 로그 관점에서 볼 수 있는 "무언가 발생"의 예입니다. 프로세스는 계속 기록되지만 syslog의 프로세스 이름은 변경됩니다. 프록시의 모든 메시지가 "uuid=..."로 시작하는 방식에 유의하세요. 스니펫 상단의 "xfcproxy[4808]:" 및 스니펫 하단의 "abrt:" 아래에 기록된 메시지를 볼 수 있습니다.

Aug 27 07:02:55 proxy1 xfcproxy[4808]: uuid=63e63d9e connection=Open client_ip=192.168.3.21 client_port=40973
Aug 27 07:02:55 proxy1 xfcproxy[4808]: uuid=63e63d9e connection=Information method=CONNECT path=www.example.com port=443
Aug 27 07:02:55 proxy1 xfcproxy[4808]: uuid=63e63d9e rule=Destination message="Match made" rule=monitoring uri=www.example.com
Aug 27 07:02:55 proxy1 rsyslogd-2177: imuxsock begins to drop messages from pid 4808 due to rate-limiting
Aug 27 07:02:55 proxy1 abrtd: New client connected
Aug 27 07:02:55 proxy1 abrtd: Directory 'pyhook-2014-08-27-07:02:55-4808' creation detected
Aug 27 07:02:55 proxy1 abrt-server[27032]: Saved Python crash dump of pid 4808 to /var/spool/abrt/pyhook-2014-08-27-07:02:55-4808
Aug 27 07:02:55 proxy1 abrtd: Executable '/var/lib/xfcProxy/bin/xfcProxy.py' doesn't belong to any package and ProcessUnpackaged is set to 'no'
Aug 27 07:02:55 proxy1 abrtd: 'post-create' on '/var/spool/abrt/pyhook-2014-08-27-07:02:55-4808' exited with 1
Aug 27 07:02:55 proxy1 abrtd: Deleting problem directory '/var/spool/abrt/pyhook-2014-08-27-07:02:55-4808'
Aug 27 07:03:37 proxy1 rsyslogd-2177: imuxsock lost 1642 messages from pid 4808 due to rate-limiting
Aug 27 07:03:37 proxy1 abrt: uuid=06bc7247 connection=Open client_ip=192.168.3.21 client_port=40976
Aug 27 07:03:37 proxy1 abrt: uuid=06bc7247 connection=Information method=CONNECT path=www.example.com port=443
Aug 27 07:03:37 proxy1 abrt: uuid=06bc7247 rule=Destination message="Match made" rule=monitoring uri=www.example.com

"ps"를 사용하면 실행 중이던 PID 4808이 여전히 실행 중임을 확인할 수 있습니다.

[root@proxy1 log]# ps 4808
  PID TTY      STAT   TIME COMMAND
 4808 ?        S      1:34 python /var/lib/xfcProxy/bin/xfcProxy.py
[root@proxy1 log]#

"imuxsock이 메시지 삭제를 시작했습니다"는 다소 정상입니다. 이 데몬은 매우 수다스럽습니다(여기서는 연속 메시지의 작은 하위 집합만 표시함). 속도 제한 문제를 제외하고 일련의 메시지가 속도 제한을 완전히 트리거할 수 있습니다.

abrt에 대한 나의 지식은 제한적이지만 충돌 정보가 없는 것 같지만 프로세스 충돌은 로그 타이밍과 관련이 있다고 생각합니다.

[root@proxy1 abrt]# pwd
/var/spool/abrt
[root@proxy1 abrt]# ls -l
total 4
-rw-r--r--. 1 root root  0 Mar 18 15:45 abrt-db
-rw-------  1 root root 33 Aug 27 07:02 last-via-server
[root@proxy1 abrt]# echo `cat last-via-server `
/var/lib/xfcProxy/bin/xfcProxy.py
[root@proxy1 abrt]#

문제의 프로세스는 다중 스레드 Python 프로세스입니다. 스레드를 제대로 정리하지 않아 이 동작이 발생한다는 생각에 확실히 열려 있습니다. 이건 정말 이상한 행동이에요.

@Mikel에 대한 설명:

  • 예, RHEL 6입니다.
  • rsyslog를 통한 /var/log/messages. 아직 저널링을 시도하지 않았으며 이러한 변경을 시도하려면 비프로덕션 서버에서 재현해야 합니다.

아래의 포상금 기간이 업데이트되었습니다.

죄송하지만 다음과 같은 이유로 E Carter Young의 기존 답변에 현상금을 수여할 수 없습니다.

  1. rsyslog 소스를 보면 알 수 있는 한 imuxsock 속도 제한은 프로세스에 대한 어떤 종류의 변경도 유발하지 않으며 어떤 방식으로든 abrtd를 포함하지 않습니다. 일시적으로 스트림을 중단한 다음 나중에 읽기를 다시 시작합니다.
  2. 프로세스가 syslog에 과도하게 쓰는 것은 버퍼 오버플로 상황이 아닙니다. 리소스 활용, 예. 서비스 거부일 수도 있지만 버퍼라고 해서 너무 꽉 차 있다고 해서 버퍼 오버플로가 발생하는 것은 아닙니다.
  3. 설명된 단계는 실제 상황과 일치하지 않습니다. 특히 6단계에서 rsyslog는 abrt 프로세스에서 얻어지지 않지만 원래 프로세스에서 abrt라는 이름을 사용하는 이유는 무엇입니까?
  4. 나는 여기에도 경쟁 조건이 있다고 믿지 않습니다. (로그 버퍼를 빨리 채우는 것은 경쟁 조건이 아닙니다)

이 질문은 너무 복잡하고 데이터가 부족하다고 생각합니다. 결국 더 많은 데이터를 사용하여 질문할 수 있는 여러 가지 간단한 질문으로 귀결됩니다.

  • 정의에 따라 abrtd가 충돌한 프로세스에서 실행되는 경우 종료되지 않는 프로세스에서 실행되는 이유는 무엇입니까? abrtd가 관련될 만큼 충분한 충돌을 나타내는 것은 무엇입니까? 저는 사라진 로그에 답이 있다고 생각하지만, 사라진 로그 자체가 답은 아니라고 생각합니다. rsyslog가 abrtd를 호출한다는 증거는 없습니다.
  • rsyslog가 프로세스에서 abrtd를 트리거한 후 abrt를 프로세스 이름으로 사용하기 시작하는 이유는 무엇입니까(이전 질문에서 답변한 것처럼 입증 가능한 방식으로)?

아쉽게도 오늘은 더 많은 데이터 없이 이러한 질문을 제기하기가 꺼려집니다.

이 답변을 받아들일 수는 없지만 확실히 가치 있는 답변이라고 생각합니다.

  • abrtd 블랙리스트 설명
  • 내가 선택할 수 있는 옵션을 명확하고 간결하게 논의하세요.
    • 속도 제한 및 클러터 로그 추가 또는 제거
    • 프로세스 길이 변경
    • abrt를 사용하여 프로세스를 블랙리스트에 추가하여 프로세스가 개입하지 않도록 하세요.

따라서 현상금이 만료되면 현상금의 절반이 E Carter Young의 답변에 가장 많이 투표된 답변으로 전달됩니다.

답변1

프로세스가 abrtd에 의해 처리되는 것을 원하지 않으면 abrtd 블랙리스트에 추가하세요.이 conf 파일. Imuxsock은 속도 제한이 활성화되어 있기 때문에 로깅 양을 제한하고 있습니다. 제한에 도달하면 abrt는 더 이상 실제 프로세스 이름을 기록하지 않도록 지시되었기 때문에 더 이상 실제 프로세스 이름을 기록하지 않으므로 프로세스가 계속 실행 중이므로 abrt가 대체 항목으로 표시됩니다. 바라보다이 블로그. 당신은 사용을 고려할 수 있습니다오징어

고쳐 쓰다
이 업데이트된 섹션을 이해하려면 다음 내용을 읽어야 합니다.멀티플렉싱, 구체적으로:

컴퓨터 프로그래밍에서는 단일 메모리 리소스(예: 파일 핸들)를 사용하여 여러 외부 리소스(예: 디스크 파일)를 처리하는 것을 의미할 수 있습니다.


문제가 있는 프로세스의 파일 핸들은 메모리 리소스로 파이프됩니다. 정상적인 상황에서는 대부분의 서비스와 프로세스에 종료 코드가 있습니다. 속도 제한에 도달하면 immux 소켓은 제어를 rsyslog로 전송하여 다음 줄을 작성합니다.

imuxsock은 속도 제한으로 인해 pid 4808에서 메시지를 삭제하기 시작했습니다.

이 시점에서 abrt는 문제가 있는 프로세스가 예외 종료 코드로 종료될 것이라고 가정하고 문제가 되는 프로세스와 모든 출력을 기록합니다 /var/spool/abrt/pyhook-(time_date). 스크립트에 종료 코드가 없으므로 다음에 로그가 기록될 때 rsyslog가 모든 것을 가져옵니다. imuxsocket 버퍼에 있지만 소켓 버퍼는 결코 비워지지 않으므로 5단계를 참조하십시오. 프로세스가 여전히 실행 중이므로 버퍼 문제가 발생합니다... 해커는 일반적으로 이러한 상황을 버퍼링 영역 오버플로로 전환합니다. 이러한 단계는 다음 순서로 발생합니다.

  1. Imuxsock은 프로세스 4808이 보고되어서는 안 된다고 rsyslog에 보고합니다.
  2. abrtd는 이상한 동작을 보고하고 시작하도록 구성되었습니다.
  3. rsyslog는 요청을 존중합니다.
  4. 귀하의 스크립트는 pid 4808의 로그에 계속 기록하며 그렇게 설계했기 때문에 종료 코드가 보고되지 않습니다.
  5. abrtd는 rsyslog에 종료 코드를 제공할 수 없다는 것을 인식하고 다음을 수행합니다(프로세스가 종료되지 않기 때문에).

8월 27일 07:02:55 Proxy1 abrtd: 문제 디렉터리 '/var/spool/abrt/pyhook-2014-08-27-07:02:55-4808' 삭제

종료 코드가 보고되면 abrtd는 오류 보고서를 보냅니다(구성된 경우). 바라보다abrtd 매뉴얼 페이지/var/spool/abrt/pyhook-2014-08-27-07:02:55-4808
2단계를 따르면 6.rsyslog의 내용이 표시 되며 abrt가 여전히 5단계의 종료 코드를 기다리고 있기 때문에 abrt 프로세스인 imux 버퍼의 최신 항목을 가져오기 위해 프로세스 4808을 보고할 수 없습니다. 5단계는 완료되지 않았습니다...

프로그래밍 용어로 이를 경쟁 조건이라고 합니다. 로그 버퍼가 출력을 쓸 수 있는 것보다 더 빠르게 로그 버퍼를 채우는 프로그램을 작성합니다. 그러므로:

  • SysSock.RateLimit.Interval > 5초 및 SysSock.RateLimit.Burst > 200을 설정합니다.
  • SysSock.RateLimit.Interval = 0으로 설정하고 로그를 복잡하게 만듭니다.
  • 자세한 정보를 설정하기 위해 매개변수를 사용하여 프로그램을 다시 작성하세요.
  • 스크립트를 서비스로 실행하고 abrtd 구성에서 블랙리스트에 추가

관련 정보