php – Finn Christiansen https://blogarchive.finnchristiansen.de Softwareentwickler mit einer Vorliebe für freie Software und GNU / Linux Sat, 08 Dec 2018 16:50:58 +0000 de-DE hourly 1 https://wordpress.org/?v=5.1.1 https://blogarchive.finnchristiansen.de/wp-content/uploads/2017/01/cropped-FinnsBlog512-32x32.png php – Finn Christiansen https://blogarchive.finnchristiansen.de 32 32 Datenströme STDOUT und STDERR umleiten und mit Bash, Python oder PHP ausgeben https://blogarchive.finnchristiansen.de/2016/06/30/datenstroeme-stdout-und-stderr-umleiten-und-mit-bash-python-oder-php-ausgeben/ https://blogarchive.finnchristiansen.de/2016/06/30/datenstroeme-stdout-und-stderr-umleiten-und-mit-bash-python-oder-php-ausgeben/#respond Thu, 30 Jun 2016 17:26:57 +0000 https://www.finnchristiansen.de/?p=141 Continue reading ]]> Als Linux Anweder oder Nutzer sonstiger unixoider System ist man wahrscheinlich mit dem Konzept der Standard-Datenströme vertraut. Gemeint sind damit die Standardeingabe STDIN, Standardausgabe STDOUT und Standardfehlerausgabe STDERR. Besonders die Ausgaben STDOUT und STDERR beschäftigen mich regelmäßig, weshalb ich hier kurz ein Beispiel für Bash, Python und PHP zeigen möchte und wie man STDOUT und STDERR sinnvoll umleitet.

Natürlich darf ich die Standardeingabe nicht vergessen zu erwähnen, aber ein kurzes Beispiel sollte genügen:

# mit grep nach foobar in der Datei test.log suchen
grep foobar < test.log
# oder etwas alltagstauglicher: einen MySQL Dump einspielen
mysql -h server -u user -p < dump.sql

Ich muss zugeben, dass das grep-Beispiel nicht allzu gut ist, denn normalerweise lässt man das Kleiner-als-Zeichen

<
  weg, da grep nicht nur aus der Standardeingabe lesen, sondern auch direkt in Dateien suchen kann. Das zweite Beispiel, in dem mysql einen MySQL Dump aus der Standardeingabe liest, macht in der Praxis schon ein wenig mehr Sinn.

Die Standard(fehler)ausgabe verwende ich recht häufig, da die Unterscheidung zwischen normalen Ausgaben und Fehlern in vielen Situationen sehr hilfreich ist. Die Ausgabe einer Datei kann man mit dem Größer-als-Zeichen

>
  umleiten. Das Ziel der Umleitung kann eine gewöhnliche Datei oder ein sonstiger Dateideskriptor (z.B. /dev/null oder STDOUT) sein.

Ein einzelnes Größer-als-Zeichen überschreibt den eventuell vorhandenen Inhalt einer Datei, ein doppeltes Größer-als-Zeichen

>>
  hängt die Ausgabe an die Datei an. Falls die Datei noch nicht exisitert, wird Sie erstellt, insofern das Verzeichnis existiert.

Meistens habe ich mit Bash-, Python- oder PHP-Skripten zu tun, weshalb ich für diese Sprachen je ein kleines Beispiel für das Schreiben in STDOUT (sollte ja bereits bekannt sein) und STDERR zeige. Wer kein komplexes Logging einsetzen möchte, sondern nur zwischen normalen Meldungen und Fehlermeldungen unterscheiden möchte, sollte sich die gelegentliche Verwendung von STDERR angewöhnen.

Bash

#!/bin/bash
echo "Eine informative Meldung in STDOUT";
>&2 echo "Ein Fehler in STDERR";

Python

#!/usr/bin/env python
import sys

print("Eine informative Meldung in STDOUT")
sys.stdout.write("Auch eine informative Meldung in STDOUT\n")
sys.stderr.write("Ein Fehler in STDERR\n")

PHP

#!/usr/bin/php
<?php
print "Eine informative Meldung in STDOUT\n";
fwrite(STDOUT, "Auch eine informative Meldung in STDOUT\n");
fwrite(STDERR, "Ein Fehler in STDERR\n");
?>

Da diese Skripte nun Ausgaben in STDOUT und STDERR erzeugen, kann man anfangen, die Ausgaben umzuleiten oder unterschiedlich zu behandeln.

Nur STDOUT nach /dev/null umleiten (praktisch für Cronjobs)

./test.py > /dev/null

Alles nach /dev/null umleiten (alle Ausgaben unterdrücken)

./test.py > /dev/null 2>&1

STDOUT nach /dev/null umleiten, STDERR loggen

./test.py > /dev/null 2> error.log

STDOUT und STDERR in separate Dateien loggen

./test.py > info.log 2> error.log

Um die alten Log-Dateien nicht zu überschreiben, können zwei Größer-als-Zeichen verwendet werden:

./test.py >> info.log 2>> error.log

STDOUT und STDERR in separate Dateien loggen, aber STDERR zusätzlich ausgeben (sehr praktisch bei Cronjobs)

./test.py >> info.log 2> >(tee -a error.log >&2)

Mit den genannten Mitteln ist man nun in der Lage, sinnvoll mit Ausgaben umzugehen und ich selbst habe nun eine kleine Gedächtnisstütze, denn auch ich muss des Öfteren etwas nachschlagen, wenn ich es eine Weile nicht benötigt habe.

]]>
https://blogarchive.finnchristiansen.de/2016/06/30/datenstroeme-stdout-und-stderr-umleiten-und-mit-bash-python-oder-php-ausgeben/feed/ 0