モジュールがスクリプトの出力をファイルにキャプチャするためにパラメータを使用しないようomprog
な問題が発生しました。私は何が間違っていましたか?rsyslog
output
私のrsyslog
サーバーは外部ホストから毎秒12個のsyslogメッセージを受け取り、メッセージが特定の条件を満たすときに特定のタスクを実行したいと思います。そのため、特定の条件をスキャンしてstdin
タスクを実行するPythonスクリプトを作成しました。 (これは約数時間ごとにトリガーされます。)他のすべてのメッセージの場合、Pythonスクリプトはメッセージを削除して受信し続けます。パイプが開くと、Pythonスクリプトは無期限に実行されます。すべて完璧です。
stdout
次に、Pythonスクリプトの起動時に「開始済み」メッセージを出力し、ジョブが発生したstdout
ときに「完了」メッセージを出力するように、いくつかの確認メッセージをPythonスクリプトに追加しました。omprog
パラメータconfirmMessages
をに設定off
し、output
パラメータを/var/log
。出力はgetenforce
SELinuxがダウンしたことを知らせます。再起動すると、rsyslog
ファイルは生成されず、出力はキャプチャされません。
だからtouch
私はsyslogユーザーとしてファイルを編集して再起動しましたが、rsyslog
問題は解決しませんでした。実行すると、systemctl status rsyslog
Pythonスクリプトが実行中であることを示します。スクリプトを見ると、特定のメッセージが実行されていることを確認できます。
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)