omprog는 스크립트 출력을 파일로 캡처하지 않습니다.

omprog는 스크립트 출력을 파일로 캡처하지 않습니다.

모듈이 스크립트의 출력을 파일에 캡처하기 위해 매개 변수를 사용 하지 않는 omprog것 같은 문제가 발생했습니다 . 내가 뭘 잘못했나요?rsyslogoutput

rsyslog서버는 외부 호스트로부터 초당 12개의 syslog 메시지를 수신하며 메시지가 특정 조건을 충족할 때 특정 작업을 수행하고 싶습니다. 그래서 특정 조건을 스캔 stdin하고 작업을 수행하는 Python 스크립트를 작성했습니다. (이 작업은 대략 몇 시간마다 트리거됩니다.) 다른 모든 메시지의 경우 Python 스크립트는 메시지를 삭제하고 계속 수신합니다. 파이프가 열리면 Python 스크립트가 무기한 실행됩니다. 모두 완벽해요.

stdout그런 다음 Python 스크립트가 시작될 때 "시작됨" 메시지를 출력하고 stdout작업이 발생할 때 "완료" 메시지를 출력하도록 몇 가지 확인 메시지를 Python 스크립트에 추가했습니다. omprog매개변수를 confirmMessages로 설정 off하고 output매개변수를 /var/log. 출력에서는 getenforceSELinux가 다운되었다고 알려줍니다. 재부팅하면 rsyslog파일이 생성되지 않고 출력이 캡처되지 않습니다.

그래서 touchsyslog 사용자로 파일을 편집하고 재부팅했지만 rsyslog문제가 해결되지 않았습니다. 실행하면 systemctl status rsyslogPython 스크립트가 실행 중임을 나타냅니다. 스크립트를 보면 특정 메시지가 실행되고 있음을 확인할 수 있습니다.

Python 스크립트를 수동으로 실행하면 출력이 생성되고 Ctrl+를 누를 때까지 무기한으로 유지됩니다 D.

stderr또한 stdout이것이 차이를 만드는지 확인하기 위해 Python 스크립트 출력을 구성했습니다 . 다시 시작한 후에도 rsyslog여전히 출력 파일이 없습니다.

체계:Ubuntu 20.04.2 LTS

rsyslogd:version 8.2001.0

rsyslog 구성:

module(load="omprog")
if $fromhost-ip == '10.200.25.5'     then {
  action(type="omfile"
    file="/var/log/network")
  action(type="omprog"
    name="rsyslog_watch_vpn_attach"
    binary="/usr/share/rsyslog/watch_syslog_vpn_attach.py"
    confirmMessages="off"
    output="/var/log/watch_vpn_attach.log")
  stop
}

파일 /var/log/network을 빌드하는 중입니다. 파일 /var/log/watch_vpn_attach.log이 빌드되지 않았습니다.

내가 뭘 잘못하고 있는지 아는 사람 있나요?

답변1

이는 Python 프로그램의 버퍼링 문제일 수도 있습니다. 간단한 해결책은 flush=True다음과 같은 인쇄 문을 추가하는 것입니다 .

#!/usr/bin/python3
import sys,time
for data in sys.stdin:
    print(f"got data at {time.asctime()}: {data}",flush=True)

관련 정보