Ich kann pushenstdout / stderrvon demKlingelnBefehl an rsyslog wie folgt:
ping www.superuser.com 2>&1 | logger -p user.info
Auf meinem System kann die "Live"-Ausgabe mit einem einfachen angesehen werden tail -f /var/log/messages
. Sie gelangt dorthin aufgrund der entsprechenden Zeile in meinem /etc/rsyslog.config
:
# Log anything (except mail) of level info or higher.
# Don't log private authentication messages!
*.info;mail.none;authpriv.none;cron.none -/var/log/messages
Bei meinem benutzerdefinierten Programm funktioniert das allerdings nicht:
myprogram 2>&1 | logger -p user.info
Die myprogram-Binärdatei kehrt nicht sofort nach dem Aufruf zurück/wird beendet - sie läuft eine Zeit lang - und gibt ab und zu Nachrichten (mit printf) auf der Konsole aus. Sie verhält sich so, wenn ich ihre Ausgabe nicht in den Logger umleite. Korrigieren Sie mich, wenn ich falsch liege, aber dieses Verhalten ist ähnlich wie dasKlingelnBefehl (zumindest wenn das Ziel erreicht ist).
Warum sehe ich dann die Ausgabe von myprogram nicht in /var/log/messages
? Könnte die Ausgabe irgendwie gepuffert sein und gelangt einfach noch nicht zum Logger? Könnte es etwas anderes an der rsyslog.conf
Konfigurationszeile sein?
Antwort1
Es stellte sich heraus, dass es die Ausgabe vom myprogram
Puffern war. Mit den erwähnten Tricksin dieser FrageMir ist schnell eine Lösung eingefallen:
script -q -c "myprogram" | logger -p user.info