Archiv der Kategorie: Open Source

command not foundDieses Bild hat ein leeres alt-Attribut; sein Dateiname ist shira128x128.png.

Shira, meine Katze, kommt sporadisch zur Tastatur, und reibt ihren Kopf daran – v.a. wenn ich die Tastatur auf dem Schlafsofa auf dem Rücken liegend auf dem Bauch balanciere.

Sie schrubbt sich den Nacken und gibt v.a. die am Rande liegenden Zeichen des Ziffernblocks 0,+ und Enter ein. Das sind keine installierten Kommandos/Programmnamen, so dass da nicht allzu viel passieren kann, aber der Rechner reagiert allenfalls mit

000,000+0000++++,,,: Befehl nicht gefunden.

Das ist natürlich nicht sehr einladend für meine Katze. Meine erste Lösung (v0.1) war, dass der Rechner bei signifikanten Shirakommandos mit `echo Hallo Shira` reagiert. Aber Lesen ist nicht ihre Stärke.

Also veröffentlichte ich bald darauf v0.2, die eine Audioaufnahme von 2-3 Sekunden abspielt, die „Hallo Shira, miau“ wiedergibt.

Auf Github https://github.com/Stefan-Wagner/shira kann man den Code runterladen.

Im Wesentlichen sind es 2-3 zusätzliche Zeilen, die ich der Funktion, die ich in /etc/bash.bashrc gefunden habe, zugefügt habe, und ich lade dieses in meinem eigenen /bin-Ordner gespeicherte Script mit dieser Funktion aus meiner ~/.bashrc via source-Befehl (`source ~/bin/shira.sh`) um System und meinen Kram sauber getrennt zu halten.

Ändert man die /etc/bash.bashrc direkt, bekommt man evtl. Konflikte bei Updates. Migriert man all seine Einstellungen auf einen anderen Rechner, vergisst man solche Details auch gerne.

Im Unterschied zur Originalfunktion beginnt meine mit:

if [[ $1 =~ ^[0,+]+$ ]]
then
    echo hallo $katze
    aplay ~/lib/helloMyCat.wav 2>/dev/null &
elif [ -x /usr/lib/command-not-found ]; then

Das GLEICH-TILDE ist ein regex-Vergleich, und `[0,+]` beschreibt die Gruppe der 3 Zeichen 0, Komma und Plus, von denen mindestens eins, aber beliebig viele vorkommen können (+), und es funktioniert wie gewollt, es gibt „Hallo Shira“ auf dem Bildschirm und „Hallo Shira, Miau“ auf dem Lautsprecher aus. In Zeile 5, beim elif, beginnt das Original erst mit if.

Wenn Sie auch etwas auf dem Lautsprecher ausgeben wollen, müssen Sie es zuvor selbst aufnehmen und entsprechend speichern und aufrufen. Ich habe mir einen eigenen Ordner ~/lib gemacht, in dem ich die Datei gespeichert habe, aber für viele Nutzer wird das übertrieben sein.

fcd (fast-cd) Version 1.1

Bugfix/Update nach Hinweisen von m-bostaurus.

Beim Aufruf von fcd mit bin als Zielordner erlebte m-bostaurus, dass nur 1 Verzeichnis gefunden wurde. Meine erste Vermutung, es könne daran liegen, dass zu viele Treffer gefunden werden, und die Parameterliste zu lang ist, bewahrheitete sich zwar nicht, aber mit dem Umbau, der das Problem beheben sollte, war es behoben.

Ich verwende jetzt `mapfile`, um die Suchergebnisse in ein Array zu packen.

Hier der neue Code:

#!/bin/bash
#
# fcd.sh:
#
# Fast change directory. Should be sourced from ~/.bashrc file, since it is and
# needs to be a function.
#
#	Update Ver.1.1, 2021-03-03
#		Bugfix for missing results when fast changing to "bin", thanks to m_bostaurus.
#	Update Ver.1.0, 2021-02-07
#		changed from egrep to mapfile, see code. Handles blanks in paths now flawlessly.
#   Update Ver.0.9, 2013-08-21, comments, publication
#
#   Prototyp 2010
#
# This program depends on locate/updatedb, which aren't always installed/activated.
# If you use the shell on a regular basis, you should have them installed, though.
#
#	(c) GPLv3 (2010, 2021)
#
fcd ()
{
	suchdirname=$1
	# list=$(locate $1 | egrep "/$1$"); # Version 1
    # update 12.02.2021
    # mapfile -d '' list < <(locate -b -0 -r "$suchdirname$")
    # update 19.02.2021
    mapfile -d '' list < <(locate -b -0 -r "^$suchdirname$")
    # count=$(echo $list | wc -w );
    # update 19.02.2021
    count=${#list[@]}
    case $count in
        0)
            echo "unknown directory: "$1 && return
            # could search for partial matches Doc => Documentation
        ;;
        1)
            if [[ -d "${list[0]}" ]]; then
                echo "1) match: $list";
                cd "$list";
            else
                echo "not a directory: $1";
            fi
        ;;
        *)
            select directory in "${list[@]}" "/exit/";
            do
                if [[ "$directory" = "/exit/" ]]; then
                    break;
                fi;
                if [[ -d "$directory" ]]; then
                    echo "multi) $directory";
                    cd "$directory";
                    break;
                else
                    echo "not a directory: "$1;
                fi;
            done
        ;;
    esac
}

Der neue Code ist jetzt 2 Wochen bei mir im Einsatz, und funktioniert tadellos.

Wenn aber doch jmd. noch Fehler findet – immer her damit!

Es geht bergauf!

Es geht bergauf und es ist nicht schön. Jetzt hatten wir wochenlang Teillockdown und die Diskussionen gingen gerade los, wer zuerst aufmachen darf, mit Frisören und Schulen in Reihe eins, und dann sowas!

Für Mo., Di., Mi. und Do. zeigt der Wochentagsgraph (basierend auf den Daten von worldometers) hinten einen kleinen Anstieg – allerdings nicht für Fr. (gestern).

Woher sind die Grapen? Nun, mit einem Script selbst generiert. Der schleichende Durchschnitt hat auch seine Berechtigung – zumindest der über 7 Tage, in dem über 3 Tage sehe ich keinen Sinn, und die Haifischzähne im Wochenverlauf scheinen ein globales Phänomen zu sein.

Ich fürchte, dass während die Zahlen maßnahmenbedingt zurückgingen stiegen gleichzeitig die Zahlen durch die Mutanten im Untergrund an, und jetzt haben sich die beiden Trends gekreuzt. Ich bin da aber natürlich Laie, wie viele andere auch.

Das Basteln der ersten Graphen war noch viel Handarbeit, aber dann wurde es von mir teilautomatisiert, so dass das Script die Daten jeden Tag neu runterlädt.

#!/bin/bash
# 
# Coronadaten von worldometers nach Wochentag getrennt anzeigen
#
# @DONE: Lines einfärben nach Wochentag
# @DONE: Automatisieren. 
#
# Lizenz: GPLv3  
#

yvals=($(wget -O - https://www.worldometers.info/coronavirus/country/germany/ 2>/dev/null | sed -ne "s/,/ /g; /name: 'Daily Cases'/,/]/ {s/data: \[null//; s/].*}//p}"))

ny=${#yvals[@]}

for i in $(seq 0 $((ny-1)))
do
	echo -e "$i\t${yvals[$i]}"
done > xy.dat

tag=(dummy Sa So Mo Di Mi Do Fr)
farbe=(dummy black blue olive red dark-grey grey web-green)

max () {
	echo $@ | tr " " "\n" | sort -n | tail -n 1
}

maxy=$(max ${yvals[@]})

zeros=${maxy//[0-9]/0}
top=$((${maxy:0:2}+1))${maxy:3:-0}${zeros:2}
echo top $top

# leeren
echo >  plot7.plt

# In 7-Tagesschritten von Sa. bis Fr. (weil Sa. 1. Meßpunkt ist, Sa:=1) durchlaufen, getrennte Dateien erzeugen
for i in {1..7}; do sed -n "$i~7p" xy.dat > wotag-$i-${tag[$i]}.csv ; done
# Gnuplot-Datei erzeugen
for i in {1..7}; do
	echo "
	set term qt
	set xrange [0:$((ny*105/100))]
	set yrange [0:$top]
	set title \"${tag[$i]}\"
	plot \"wotag-$i-${tag[$i]}.csv\" using 1:2 with linespoint lc \"${farbe[$i]}\"
	set output  \"wotag-$i-${tag[$i]}.png\"
	set term png
	replot"
done >> plot7.plt
gnuplot -p plot7.plt
# eog: Eye-of-Gnome Bildbetrachter.
eog wotag-[1-7]-*.png

(Update 22.2.’21 Das Ausgabeformat habe ich nachträglich auf png geändert (set term png; set output ….png) und den Bildbetrachteraufruf eog am Ende angefügt.)

Anfangs speicherte ich die Seite vom Browser aus im Modus „Seitenquelltext anzeigen“. Er liefert keine fertige Bilddatei aus, sondern die Daten und generiert aus diesen die Grafik on the fly. So kommt man also einfach an die Daten.

Zu Beginn zeigt das Script einen Shebang, der dem Kernel sagt, wie das Programm auszuführen ist. Es folgen Kommentare mit der Gnu-Public-Lizence.

Dann der Code, um das HTML als Datei runterzuladen, dafür nimmt man wget.

yvals=($(wget -O - https://www.worldometers.info/coronavirus/country/germany/ 2>/dev/null | sed -ne "s/,/ /g; /name: 'Daily Cases'/,/]/ {s/data: [null//; s/].*}//p}"))

Mit -O gibt man den Outputort an, meist einen Dateinamen, aber wie viele Shellwerkzeuge, kann auch wget ein isoliertes Minuszeichen übergeben werden, dann wird die Ausgabe auf Stdout, den Bildschirm, ausgegeben.

Aber wget ist geschwätzig und zeigt mit großem Brimborium an, wieviel Prozent schon runtergeladen wurden, Datum, Uhrzeit, Url, IP-Adresse und weiß der Teufel – den Müll kann man mit 2>/dev/null ins Nirwana umleiten.

Der restliche Output wird mit einer Pipe an Sed geleitet, den Stream-Editor, spezialisiert für solche Jobs und mit einer konzentrierten Syntax ausgestattet, um die Ausgabe zu schneiden, umzuformen, zu ergänzen, zu manipulieren.

Mit sed wandel ich alle Kommas in Leerzeichen um. Ich will alles in ein großes Array schreiben, und die Syntax sieht so aus:

yvals=(3 4 2 1 9)

Aber die Quelle liefert

data: [3,4,2,1,9]

Auch interessiert mich nur der Abschnitt „Daily Cases“ und darin nur die Zeile „data“. Die nächste, kryptisch wirkende Zeile, ermittelt die Arraygröße.

Die folgende Forschleife läuft durch alle Werte, und gibt Zeilenweise die Indexnummer und die Anzahl bestätigter Neuinfektionen aus. Die Umlenkung hinter der Schleife lenkt all das in eine Datei xy.dat.

ny=${#yvals[@]}

for i in $(seq 0 $((ny-1)))
do
	echo -e "$i\t${yvals[$i]}"
done > xy.dat

Die Beispieldaten oben sähen damit etwa so aus:

0	3
1	4
2	2
3	1
4	9

Dann folgen zwei Arrays mit Namen für die Wochentage – da die Shell ab 0 zählt, aber ich ab 1, habe ich einen dummy für die 0 eingefügt. Ähnlich für die Farben des Graphen.

tag=(dummy Sa So Mo Di Mi Do Fr)
farbe=(dummy black blue olive red dark-grey grey web-green)

max () {
	echo $@ | tr " " "\n" | sort -n | tail -n 1
}

Dann sehen wir eine max-Funktion. Sie übergibt alle Argumente des Arrays, die mit Leerzeichen getrennt sind, und ersetzt die Leerzeichen mit tr, dem Zeichentranslator, mit Zeilenumbrüchen. Die Zeilen werden mit sort sortiert und tail -n1 nimmt vom Ende eine Zeile, da steht nach Adam Riese das Maximum drin.

Die nächste Zeile ruft die max-Funktion mit unserem Array auf.

maxy=$(max ${yvals[@]})

zeros=${maxy//[0-9]/0}
top=$((${maxy:0:2}+1))${maxy:3:-0}${zeros:2}
echo top $top

Dann folgt eine komplexe Häßlichkeit, die einen Wert wie 31554 nimmt, die 31 vorne abschneidet, zu 32 hochrechnet, und 000 hinten anhängt aber auch mit Werten zwischen 100 und 99999999 zurechtkommen sollte.

Sie dient dazu dem Plotprogramm zu sagen, wie groß der y-Wert werden darf, aber einen aufgerundeten Wert zu verwenden mit etwas Luft nach oben. Da die Werte je nach Wochentag gehörig schwanken führt die automatische Range-auswertung von gnuplot sonst dazu, dass der Achsenmaßstab von Tag zu Tag schwankt.

# leeren
echo >  plot7.plt

Dies löscht die plot7.plt-Datei von gestern oder neulich. Dann schreibe ich, wieder mit sed, das ein Kommando dafür hat, jede 7. Zeile in eine Datei, und das für 7 unterschiedliche Startwerte, sprich Wochentage, in 7 unterschiedliche Zieldateien (.csv).

for i in {1..7}
do
  sed -n "$i~7p" xy.dat > wotag-$i-${tag[$i]}.csv
done

Dann werden je Wochentag ca. 8 Befehle in die Plotdatei geschrieben.

# Gnuplot-Datei erzeugen
for i in {1..7}; do
	echo "
	set term qt
	set xrange [0:$((ny*105/100))]
	set yrange [0:$top]
	set title \"${tag[$i]}\"
	plot \"wotag-$i-${tag[$i]}.csv\" using 1:2 with linespoint lc \"${farbe[$i]}\"
	set output  \"wotag-$i-${tag[$i]}.png\"
	set term png
	replot"
done >> plot7.plt

Das set term qt setzt die Ausgabe auf den Grafikfenstermodus. QT ist eine Firma, QT-Trolltech o.ä., die eine bekannte, plattformübergreifende Grafikbibliothek für C++ geschrieben hat, ähnlich wie GTK (C) oder Swing (Java).

Mit set xrange [von:bis]` legt man die x-Achse fest. Auch hier lasse ich etwas Luft.

Das `set title XY` bringt die Wochentage von oben ins Bild. Man will nicht im Kopf behalten müssen, dass die Datenerfassung an einem Freitag begann – oder war es Samstag?

Dann wird verklausuliert gesagt, dass die Daten von – Beispielsweise wotag-3-Mo.csv zu plotten sind. Dann ist So=2 und Sa=1, also doch Sa! Using 1:2 sind die Spalten der Datei, mehr gibt’s eh nicht, und linespoint verbindet die Datenpunkte, hebt sie aber auch vor. `lc N` setzt die linecolor, falls das wer manipulieren will. Für jeden Tag gebe ich dann einen Dateinamen an, in den das Ergebnis geschieben werden soll. Man könnte auch png, jpg, pdf usw. wählen.

Mit set term png sage ich dem Programm, dass das Format png sein soll; das extrapoliert gnuplot nicht aus dem Namen.

Oben wurde schon mal plot aufgerufen. Hier reicht ein `replot`, wenn man keinen Parameter ändern will. Das eine zeigt am Schirm in einem Fenster an, das andere schreibt in eine Datei.

Die Befehle werden aber nicht unmittelbar ausgeführt, sondern in eine Datei geschrieben und am Ende wird gnuplot aufgerufen, um die Aktionen durchzuführen.

Dabei wird die Bildschirmausgabe aber so schnell durchlaufen, dass man außer dem letzten Bild nichts sieht. Zur Kontrolle, ob nichts schiefläuft, sollte das reichen.

Alle Dateien landen im aktuellen Verzeichnis, also empfiehlt es sich dafür ein neues Verzeichnis anzulegen.

Zusammengefügt habe ich ursprünglich 7 svg-Dateien von Hand.

Das habe nun zu PNG geändert, denn die lassen sich mit einem Betrachter wie eog leicht alle ansehen, oder als Referenzen in ein SVG laden, das sich dann automatisch aktualisiert, wenn die Dateien mit altem Namen und neuen Daten überschrieben werden.

Die CSV-Dateien sind z.Zt. kl. als 500 Bytes, die PNGs < 6kb, je.

Das Datum aus den xValues zu extrahieren ist möglich, aber eine lesbare Ausgabe daraus zu bauen ist mir zu viel Gefummel.

So sieht die fertige Plotdatei aus (hier noch mit SVGs):

	set term qt
	set xrange [0:388]
	set yrange [0:32000]
	set title "Sa"
	plot "wotag-1-Sa.csv" using 1:2 with linespoint lc "black"
	set output  "wotag-1-Sa.svg"
	set term svg
	replot

	set term qt
	set xrange [0:388]
	set yrange [0:32000]
	set title "So"
	plot "wotag-2-So.csv" using 1:2 with linespoint lc "blue"
	set output  "wotag-2-So.svg"
	set term svg
	replot

	set term qt
	set xrange [0:388]
	set yrange [0:32000]
	set title "Mo"
	plot "wotag-3-Mo.csv" using 1:2 with linespoint lc "olive"
	set output  "wotag-3-Mo.svg"
	set term svg
	replot

	set term qt
	set xrange [0:388]
	set yrange [0:32000]
	set title "Di"
	plot "wotag-4-Di.csv" using 1:2 with linespoint lc "red"
	set output  "wotag-4-Di.svg"
	set term svg
	replot

	set term qt
	set xrange [0:388]
	set yrange [0:32000]
	set title "Mi"
	plot "wotag-5-Mi.csv" using 1:2 with linespoint lc "dark-grey"
	set output  "wotag-5-Mi.svg"
	set term svg
	replot

	set term qt
	set xrange [0:388]
	set yrange [0:32000]
	set title "Do"
	plot "wotag-6-Do.csv" using 1:2 with linespoint lc "grey"
	set output  "wotag-6-Do.svg"
	set term svg
	replot

	set term qt
	set xrange [0:388]
	set yrange [0:32000]
	set title "Fr"
	plot "wotag-7-Fr.csv" using 1:2 with linespoint lc "web-green"
	set output  "wotag-7-Fr.svg"
	set term svg
	replot

Diese Ranges könnte man vor den Rest rausziehen, aber das ist mehr Arbeit als Nutzen. Fragen zum Script beantworte ich gerne.

Man benötigt Linux, bei dem die meisten Tools mit an Bord sind (tr, bash, sed, sort, tail) oder leicht nachinstalliert werden können (gnuplot, wget). Unter Windows ist es für jemanden, der nicht schon Erfahrungen mit Scripten hat, mühsam, alles zu installieren und einzurichten, aber möglich. Macs haben ja ein Open-BSD als Basis, inklusive Bash, da sollte es fast so leicht sein wie unter Linux.

Schon 8 Jahre nach der Erstveröffentlichung gibt es eine neue Version von fcd, dem schnellen Verzeichniswechsler für die Shell.

(Anm.: Mithilfe der Kommentare habe ich einen Bug gefunden, und in den Kommentaren wird auch erklärt, wie man ihn beseitigt. Ein Update des Artikels folgt daher in Kürze).

Die neue Version kommt mit Leerzeichen in Verzeichnisnamen zurecht – eine Funktion, die ich nicht direkt selbst brauche, da ich keine Verzeichnisse mit Leerzeichen mache, aber immer mehr Programme legen solche Verzeichnisnamen an (z.B. ‚VirtualBox VMs‘, Zoom: ‚Unknown Organization‘, …) und diese tauchen störend in den Auswahllisten auf.

Der Fix war überraschend einfach, nachdem ich mich erst mal zu der v.a. kosmetisch gedachten Verbesserung aufgerafft hatte.

Weiterlesen

 – Der Colordaemon war da! – 

colordaemon

Heute geht es mal wieder um Linux. Und nur am Rande um den Colordaemon, ein Daemon, also ein Hintergrundprozess, der sich, wie meist, durch ein kleines D am Namensende verrät. Wobei es auch ein, zwei Dämonen gibt, sich nicht so verraten, und natürlich gibt es Programme, die zufällig auf ‚d‘ enden, ohne dass sie damit signalisieren wollen, dass sie Dämonen sind. Also ein Fall, wie geschaffen, um den Unterschied zwischen starken Indizien von Beweisen zu erläutern, wüssten nicht mehr Leute, was Indizien und Beweise sind, als was Dämonen unter unixoiden Systemen sind.

Andere, mehr oder weniger bekannte Dämonen, sind der Druckerdaemon cupsd des common unix printing service, sowie dbus-daemon, avahi-daemon, die auf andere Weise ihre Dämonenhaftigkeit äußern, aber ich verrate jetzt nicht wie, usb-storage und cron sind wohl auch Dämonen, und haben kein D am Ende. Cron spielt noch eine Rolle am Rande. Dagegen wären sed und thunderbird Programme, die trotz D-Endung keine sind.

Wen’s interessiert, ps ax -o cmd gibt die Namen aller laufenden Prozesse aus.

Das eigentliche Thema hier sind aber weder Dämonen, noch der colord im Besonderen, sondern das syslog, Scheduler und Orage. Ein Scheduler ist ein Zeitplaner und Orage ist der Zeitplaner, um den es hier geht.

Motivation:

Oft wollen Leute, dass das System sie regelmäßig über Dinge informiert, und sie wollen es auf dem Desktop sehen. Dabei treffen sie auf Linuxexperten, die oft beruflich oder ehrenamtlich Sysadmin sind, und für solche Aufgaben die seit den 60ern bewährten Programme cron/anachron benutzen (anacron ist ein anachronististischer cron, habe ich mir sagen lassen), aber diese arbeiten befehlszeilenorientiert und werden über superschlanke, jedoch leicht kryptische Tabellen, die crontabs, konfiguriert – das ist schon nicht jedermanns Sache.

Außerdem laufen sie vom Systemstart weg, noch bevor die grafische Umgebung, X11 und der ganze Desktopkrempel geladen ist und nicht mit den Rechten des Users. Auf Servern läuft meist gar keine Desktopumgebung und folglich sind sie nicht sonderlich dafür ausgelegt, dem User, der womöglich gar nicht angemeldet ist, der auch kein DE (Desktop-Environment) geladen hat, eine Popupnachricht zu senden.

Es gibt dafür Lösungen, und zwar muss man die Xauthority bemühen und 0:0 an das Programm melden, welches um 17:15 aufpoppen soll – da man das so selten macht, hat man die Syntax nicht im Kopf und ist verstimmt. Im Ubuntuusers.de-Wiki ist, unter Fenster öffnet sich nicht, vermerkt wie es geht (noch etwas nach unten scrollen).

Auch ich habe schon oft darauf verwiesen, aber jetzt, bei meiner oberflächlichen Beschäftigung mit Orage eine einfache Alternative gefunden. Und darum geht es hier. :)

Also, wenn man ein Programm, dass die grafische Oberfläche braucht, starten will, dann geht man zu Orage. Hat man oben rechts in der Systemleiste eine Uhr laufen, dann bringt ein Doppelklick darauf wahrscheinlich Orage im Kalendermodus in den Vordergrund.

orage-monat

Was wir jetzt noch brauchen ist aber ein praktisches Beispiel, und deswegen kommen wir einfach nicht auf den Punkt, sondern holen nochmal auf einem zweiten Pfad aus.

Man hat ja unter /var/log/ jede Menge Logdateien liegen, die man nie anschaut, weil man sie nicht versteht. Geht was schief mit dem System wird man dann von naseweisen Linuxgurus gefragt, was das Syslog sagt. Der 0-8-15 User weiß nicht mal, dass es sowas gibt. Also ls -l /var/log/syslog eingeben:

> ls -l /var/log/syslog
-rw-r----- 1 syslog adm 71855 Feb 23 01:07 /var/log/syslog

Mit 70kb ein ganz schön fettes Ding.

Mit less /var/log/syslog (less is more) kann man sich den Inhalt ansehen. Wenn etwas schiefläuft, dann oft richtig, und die gleiche Nachricht taucht 100fach im Logfile auf. Mit einer Länge von 3 Zeilen a 150 Zeichen kommt man leicht auf 45.000 Zeichen. Die Nachrichten zu entziffern ist schon eine Wissenschaft für sich, aber wenn man regelmäßig reinschaut kann man ja einzelnen Nachrichten nach und nach auf den Grund gehen. Und man bemerkt vielleicht, wenn das Logfile plötzlich ganz anders ausschaut.

Früher hatte ich ewig, über unterschiedlichste Distributionen und Versionen hinweg Meldungen im Syslog, dass 3 Systemfonts nicht gefunden werden konnten. Im laufenden Betrieb hat sich aber nie ein Fehler geäußert. Einmal wollte ich sie loswerden und habe das Netz durchsucht, aber weder fand ich einen Ort, um die Fonts endlich runterzuladen, noch einen Trick die Meldungen loszuwerden.

Überflüssige Fehlermeldungen sind nämlich ein Problem: Sie erhöhen das Rauschen, den Heuhaufen, in dem man dann die Nadel nicht findet.

Ein anderer Unbill war eine fehlerhafte Druckerdatei, bei hoch gesetztem Loglevel des Druckerdaemons. Der hat dann gleich 100 Zeilen Fehlerprotokoll ins Log geschrieben, und das minutenweise. Das wurde rasch zu einem Dateigrößenproblem.

Jetzt gibt es auch den wunderbaren Daemon logrotate. Der rotiert das Logsystem, und zwar insofern, als die Logdatei von gestern zu xy.0.log umbenannt wird, die von gestern, die xy.0.log hieß wird xy.1.log genannt – sinnvollerweise in umgekehrter Reihenfolge, und so weiter, und die älteste wird gelöscht. Und was älter als gestern ist wird gezippt, und da diese Logdateien oft hochgradig redundant sind, sind die gezippten Dateien oft wesentlich kleiner, als die frischen, ungezippten. Weil sysadmins so oft in diese Dateien schauen müssen, gibt es extra das Programm zless, dass ein less auf gezippte Texte ausführt.

Wir beenden den Exkurs zu den Logdateien und kommen zurück zum Thema. Als auf Stackexchange jemand fragte, wie ein grafisches Programm zeitgesteuert startet – er wollte etwas ähnliches wie Logdateien ansehen, dachte ich nach, wie ich das lösen würde, aber konnte ihm nicht konkret helfen, weil er eine Lösung für MacOS sucht. Aber so kam ich auf die Idee, 1x täglich könnte ich mir die Syslogdatei vorlegen, und wollte sehen, ob sich das nicht mit Orage lösen lässt, wo ich bemerkt hatte, dass man zur Benachrichtigung ein Programm starten kann.

Dieses Programm kann man leicht selbst schreiben, und von Orage starten lassen. Die Idee ist dabei, die oft ellenlange Ausgabe der Logdatei zu kürzen, so dass ähnliche Meldungen nur noch einmal auftauchen. Meine Logdatei zeigt etwa sowas an:

Feb 22 07:35:02 tux201t colord[1154]: (colord:1154): Cd-WARNING **: failed to get session [pid 9723]: Kein passendes Gerät bzw. keine passende Adresse gefunden
Feb 22 07:35:02 tux201t colord[1154]: message repeated 5 times: [ (colord:1154): Cd-WARNING **: failed to get session [pid 9723]: Kein passendes Gerät bzw. keine passende Adresse gefunden]
Feb 22 07:35:10 tux201t anacron[9507]: Job `cron.daily' terminated
Feb 22 07:35:10 tux201t anacron[9507]: Normal exit (1 job run)
Feb 22 07:39:33 tux201t kernel: [1253876.380868] sd 6:0:0:0: [sdb] tag#0 FAILED Result: hostbyte=DID_ERROR driverbyte=DRIVER_SENSE
Feb 22 07:39:33 tux201t kernel: [1253876.380875] sd 6:0:0:0: [sdb] tag#0 Sense Key : Hardware Error [current] [descriptor]
Feb 22 07:39:33 tux201t kernel: [1253876.380877] sd 6:0:0:0: [sdb] tag#0 Add. Sense: No additional sense information
Feb 22 07:39:33 tux201t kernel: [1253876.380882] sd 6:0:0:0: [sdb] tag#0 CDB: ATA command pass through(16) 85 06 20 00 00 00 00 00 00 00 00 00 00 00 e5 00
Feb 22 07:49:01 tux201t CRON[10242]: (stefan) CMD (date >> $HOME/foo.dat)
Feb 22 07:49:33 tux201t kernel: [1254476.385144] sd 6:0:0:0: [sdb] tag#0 FAILED Result: hostbyte=DID_ERROR driverbyte=DRIVER_SENSE
Feb 22 07:49:33 tux201t kernel: [1254476.385154] sd 6:0:0:0: [sdb] tag#0 Sense Key : Hardware Error [current] [descriptor]
Feb 22 07:49:33 tux201t kernel: [1254476.385160] sd 6:0:0:0: [sdb] tag#0 Add. Sense: No additional sense information
Feb 22 07:49:33 tux201t kernel: [1254476.385167] sd 6:0:0:0: [sdb] tag#0 CDB: ATA command pass through(16) 85 06 20 00 00 00 00 00 00 00 00 00 00 00 e5 00
Feb 22 07:59:33 tux201t kernel: [1255076.377070] sd 6:0:0:0: [sdb] tag#0 FAILED Result: hostbyte=DID_ERROR driverbyte=DRIVER_SENSE
Feb 22 07:59:33 tux201t kernel: [1255076.377081] sd 6:0:0:0: [sdb] tag#0 Sense Key : Hardware Error [current] [descriptor]
Feb 22 07:59:33 tux201t kernel: [1255076.377086] sd 6:0:0:0: [sdb] tag#0 Add. Sense: No additional sense information
Feb 22 07:59:33 tux201t kernel: [1255076.377093] sd 6:0:0:0: [sdb] tag#0 CDB: ATA command pass through(16) 85 06 20 00 00 00 00 00 00 00 00 00 00 00 e5 00
Feb 22 08:00:01 tux201t CRON[10538]: (stefan) CMD (/home/stefan/bin/blogcounter.sh -w >> /home/stefan/.bloglog)
Feb 22 08:09:33 tux201t kernel: [1255676.380279] sd 6:0:0:0: [sdb] tag#0 FAILED Result: hostbyte=DID_ERROR driverbyte=DRIVER_SENSE
Feb 22 08:09:33 tux201t kernel: [1255676.380286] sd 6:0:0:0: [sdb] tag#0 Sense Key : Hardware Error [current] [descriptor]
Feb 22 08:09:33 tux201t kernel: [1255676.380289] sd 6:0:0:0: [sdb] tag#0 Add. Sense: No additional sense information
Feb 22 08:09:33 tux201t kernel: [1255676.380293] sd 6:0:0:0: [sdb] tag#0 CDB: ATA command pass through(16) 85 06 20 00 00 00 00 00 00 00 00 00 00 00 e5 00
Feb 22 08:17:01 tux201t CRON[11053]: (root) CMD ( cd / && run-parts --report /etc/cron.hourly)
Feb 22 08:17:01 tux201t cron[926]: Please install an MTA on this system if you want to use sendmail!
Feb 22 08:17:01 tux201t CRON[11052]: (root) MAIL (mailed 107 bytes of output but got status 0x00ff from MTA#012)

Bis auf die Uhrzeit wiederholt sich vieles, und bis auf die magischen Zahlen in Backsteinklammern.

Das kann man mit sed, dem StreamEDitor, rausfiltern. Außerdem brauche ich die Angabe ‚tux21t‘, meinen Rechnernamen nicht – da ist nur der eine.

​​​​​​​sed -r 's/.* tux201t//;s/kernel: .[0-9.]+. /kernel: /;s/CRON.[0-9]+./CRON/' /var/log/syslog

colord[1154]: (colord:1154): Cd-WARNING **: failed to get session [pid 9723]: Kein passendes Gerät bzw. keine passende Adresse gefunden
colord[1154]: message repeated 5 times: [ (colord:1154): Cd-WARNING **: failed to get session [pid 9723]: Kein passendes Gerät bzw. keine passende Adresse gefunden]
anacron[9507]: Job `cron.daily' terminated
anacron[9507]: Normal exit (1 job run)
kernel: sd 6:0:0:0: [sdb] tag#0 FAILED Result: hostbyte=DID_ERROR driverbyte=DRIVER_SENSE
kernel: sd 6:0:0:0: [sdb] tag#0 Sense Key : Hardware Error [current] [descriptor]
kernel: sd 6:0:0:0: [sdb] tag#0 Add. Sense: No additional sense information
kernel: sd 6:0:0:0: [sdb] tag#0 CDB: ATA command pass through(16) 85 06 20 00 00 00 00 00 00 00 00 00 00 00 e5 00
CRON: (stefan) CMD (date >> $HOME/foo.dat)
kernel: sd 6:0:0:0: [sdb] tag#0 FAILED Result: hostbyte=DID_ERROR driverbyte=DRIVER_SENSE
kernel: sd 6:0:0:0: [sdb] tag#0 Sense Key : Hardware Error [current] [descriptor]
kernel: sd 6:0:0:0: [sdb] tag#0 Add. Sense: No additional sense information
kernel: sd 6:0:0:0: [sdb] tag#0 CDB: ATA command pass through(16) 85 06 20 00 00 00 00 00 00 00 00 00 00 00 e5 00

Das ist kürzer, und jetzt sind viele Zeilen identisch. Mit | sort | uniq -c | sort -r -n kann man die Ausgabe sortieren, mit uniq die wiederholten Zeilen löschen, uniq -c zählt dabei die gelöschten Duplikate, ein weiteres sort -r -n sortiert dann numerisch und reverse, das heißt hier absteigend.

110 kernel: sd 6:0:0:0: [sdb] tag#0 Sense Key : Hardware Error [current] [descriptor]
110 kernel: sd 6:0:0:0: [sdb] tag#0 FAILED Result: hostbyte=DID_ERROR driverbyte=DRIVER_SENSE
110 kernel: sd 6:0:0:0: [sdb] tag#0 Add. Sense: No additional sense information
109 kernel: sd 6:0:0:0: [sdb] tag#0 CDB: ATA command pass through(16) 85 06 20 00 00 00 00 00 00 00 00 00 00 00 e5 00
18 CRON: (stefan) CMD (/home/stefan/bin/blogcounter.sh -w >> /home/stefan/.bloglog)
18 CRON: (stefan) CMD (date >> $HOME/foo.dat)
18 CRON: (root) MAIL (mailed 107 bytes of output but got status 0x00ff from MTA#012)
18 CRON: (root) CMD ( cd / && run-parts --report /etc/cron.hourly)
18 cron[926]: Please install an MTA on this system if you want to use sendmail!
8 dbus[986]: [system] Activating via systemd: service name='org.bluez' unit='dbus-org.bluez.service'
7 org.freedesktop.Notifications[1801]: /home/stefan/.cache/xfce4-notifyd-theme.rc:1: error: scanner: unterminated string constant

Jetzt wollen wir noch die Ausgabe an ein simples Grafikprogramm weitergeben. Hier bietet sich Zenity an, welches bei Xubuntu dabei ist – eine Alternative wäre xdialog – das wir mit der Größe 1400×600 starten, und für das wir ein paar Label festlegen.

​​​​​zenity --list --text="Syslog messages" --column="logmsg" --width=1400 --height=600

Zenity war hier schon Thema und soll nicht näher besprochen werden. man zenity oder zenity --help verraten das wichtigste in Kürze. Auch im Ubuntuusers.de führt in den Umgang ein.

Komplett sieht unser Programm also jetzt so aus:

#!/bin/bash
#

condense syslog ((c) GPLv3)

#
sed -r 's/.* tux201t//;s/kernel: .[0-9.]+. /kernel: /;s/CRON.[0-9]+./CRON/' /var/log/syslog \
| egrep -v "Starting Hostname Service.|Started Hostname Service" | sort | uniq -c | sort -nr | \
zenity --list --text="Syslog messages" --column="logmsg" --width=1400 --height=600

Aufmerksame Leser haben bemerkt, dass sich hier noch ein Kommando eingeschlichen, hat, und zwar egrep -v "A|B" . Mit egrep -v kann man unerwünschte Zeilen ausfiltern, die ein Schlüsselwort enthalten. Diese zwei, durch ein Pipesymbol getrennte Namen A|B sind als A oder B zu lesen, und sind nach Bedarf zu erweitern, A|B|C|D … – so kann man Meldungen, die nur Erfolg verkünden, ausblenden. Wir wollen ja die unangenehmen Heinis identifizieren. Mit der Zeit wächst das sicherlich an, wenn man diszipliniert nach und nach allen Meldungen auf den Grund geht.

Weil die Befehlskette so lang ist, habe ich sie umgebrochen. Dazu benutzt man den Backslash, dem sofort ein Zeilenumbruch folgen muss, dann in der nächsten Zeile fortgesetzt.

Ich nenne sie syslog-view.sh, speichere sie in meinem bin-Dir ~/bin, welches im Pfad ist, und markiere sie mit chmod a+x ~/bin/syslog-view.sh als ausführbar.

Mit syslog-view.sh kann man sie jetzt aufrufen und sollte das auch testen. Bei Fehlern testet man sinnvollerweise erst die Filterung mit sed, dann die sort-Kette in Verbindung, schließlich ob man Zenity mit einer anderen Eingabe so aufrufen kann, und dann die Kombination.

Jetzt kommen wir zum eigentlichen Punkt, den Aufruf durch Orage. Hier sind jetzt die GUI-Freunde in ihrem Element. Wir klicken einen einzelnen Tag an, und kommen zum Tagesfenster. Da wählen wir Ereignis oder Aufgabe – der Unterschied hat sich mir noch nicht erschlossen, und dann, links unter Datei, das Symbol für Neu, das Blatt mit dem Plus.

orage-tagesfenster

Wenn wir schwach sind im Entscheiden, dann können wir hier wieder von Ereignis zu Aufgabe wechseln oder zurück. Ich war für Ereignis. Da vergeben wir einen Titel. Ort hat wenig Sinn, aber ich bin kein Orage-Crack, womöglich entgeht mir da was. Und eine Uhrzeit legen wir fest – 18:05 halte ich für eine excellente Entscheidung. Oft bin ich da schon wach.

orage-ereignis-neu1

Rubriken sind wohl interessant, wenn man viel mit Orage verwaltet. Priorität habe ich so gelassen und alles. Dauer 30 Minuten steht auch nur so da.

Nächster Reiter, Erinnerung, es wird spannend! orage-erinnerung1

Mit 0:0:0 als Erinnerungszeitpunkt verraten wir Orage, dass die Anwendung selbst die Aufgabe ist. Wenn wir ins Konzert wollen, und eine Stunde früher los müssen, dann würden wir da wohl 1 Stunde eintragen. Wir sind von der Sorte hier-und-jetzt. Anwendung wollen wir benutzen, und tragen den Pfad zum Programm und Programmnamen ein. Ob Shellkürzel wie $HOME oder ~/ funktionieren würden habe ich nicht getestet.

Nächster Reiter, Wiederholung:

orage-wiederholung1

Alle Stunde ist wohl etwas oft. Das hatte ich zum Testen eingestellt. Täglich, wöchentlich, monatlich und jährlich stehen noch zur Auswahl, und man könnte auch 2-wöchentlich oder sowas festlegen. Komplexität bitte selbst erforschen.

Tja, und jetzt poppt täglich mein Logmelder auf, und ich darf mich fragen, was der Colordämon wohl ist, und was er macht. Das Ziel ist es, nach und nach den Meldungen auf den Grund zu gehen, diejenigen zu beseitigen, die ich beseitigen kann, und diejenige auszufiltern, die harmlose Statusmeldungen sind. So dass das Logfile leerer wird, und neue Fehler dann auch auffallen.

Achso – wie sieht es in Zenity aus?

zenity-logview

Die Überschrift, man solle was auswählen, kommt vom Listenmodus zenitys. Womöglich kann man sie durch was eigenes ersetzen. Ob man OK oder Abbrechen drückt hat den gleichen Effekt – das Fenster schließt sich. Man könnte bei OK die Ausgabe auffangen und damit was anstellen (automatisierte Googlesuche, etwa, oder Frage eröffnen bei Ubuntuusers.de, oder Email an den persönlichen Linuxguru schicken.)

Ich hatte mal einen Nullmailer installiert; das wozu ist eine andere Geschichte, die hier nicht erzählt werden soll. Dann klappte es nicht mehr, wurde aber auch nicht mehr gebraucht. Daher jedenfalls stammt dieser Eintrag mit 18 Meldungen, ich solle einen MTA (Mail transport agent) installieren. Zenity kann man, meine ich, mitteilen, ob man die Zeilen edieren darf. Ja, das werde ich noch einstellen, wenn Hinweise in den Kommentaren nicht schneller sind, denn so, wie es jetzt ist, kann man schlecht den Text kopieren, um ihn selbst ins Google-Suchfeld einzugeben.

 

 – CPU-Bugs –

(Version for English talking audience below) 

intel-bug

Für Informationen zum CPU-Bug empfehle ich Heise, wobei mir genauere Informationen noch fehlen (sind meine CPUs betroffen, in Kombination mit Linux gefährdet, wahrscheinlich ja, ja). Zur Backdoor ME, die Intel-Management-Engine sah ich ein Video beim 34c3. Informativ, aber die stockende Vortragsweise auf russischem Englisch des ersten Hackers habe ich nicht lange ertragen. Als verantwortungsbewusster Blogger muss ich aber wohl schauen, was ich empfehle und verlinke, da fiel mir ein, dass es ja deutsche Simultanübersetzungen zu den Videos des #34c3 gibt. Die Übersetzer haben auch Schwierigkeiten, dem stockenden Stil Herr zu werden, aber haben eine Menge rausgeholt, finde ich. Also rechts unten am Rädchen drehen, bzw. am Rad das Submenü aufklappen, und mal testen, ob man damit besser zurechtkommt, wenn man sich für Details interessiert aber auch am Stil verzweifelt. Dem zweiten Hacker konnte ich dann gut im Original folgen. Und ja, ARM und andere sind auch betroffen. Weiterlesen

 – Der blinde Fleck – 

blinder-fleck

Der 34c3 ist nun vorbei, und vieles wurde debattiert, aber das Thema James Damore @ Google blieb seltsamerweise ausgespart.

Früher gab es ja allgemein in IT-Kreisen viel Sympathie für Google, einfach weil die Suche so viel besser war, als bei der Konkurrenz, dazu das asketische Suchinterface und mit Adblocker auch eine aufgeräumte Sache. Legofarben, die Harmlosigkeit suggerieren, dazu viele interessante Projekte, die von Google ausgehen und starke Unterstützung von Open-Source-Projekten, finanziell aber auch durch Code, durch Verlautbarungen, wo man überall Linux einsetzt und wie man sich in Standardisierungsgremien verhielt, bis hin zur Entwicklung von Android, welches auch auf Linux basiert und sowie die Konkurrenz zu Microsoft und dem snobistischen Apple.

Dann haben aber doch die Einkaufstouren gezeigt, wie viel Macht dieser nette Konzern hat; die Werbegeschäfte riechen doch unangenehm, auch wenn man sich selbst davon abschotten kann. Was hat Snowden noch mal zu Google enthüllt?

Jedenfalls Damores Rauswurf, ein internationales Thema, und der Chaos-Communication-Congress hat nichts dazu zu sagen?

Sicher, die Praxis sieht so aus, dass im Spätsommer irgendwann ein Termin verkündet wird, zu dem man seine Vorschläge, worüber man sprechen will, einreichen muss. Und wenn niemand was einreicht, dann wird keine Diskussion unterdrückt – es will sie nur niemand führen. Oder die Einreichungen waren nicht überzeugend.

Bazon Brock hat für die Dokumenta ja gefordert, dass man eine Nichtdokumenta daneben aufbauen sollte, wo man den Leuten zeigt, was es alles nicht auf die Dokumenta geschafft hat, weil sich das Publikum sonst kein eigenes Urteil bilden kann. Ähnlich gibt es vom CCCongress auch keine Liste, welche Vorschläge durchgefallen sind.

Die Szene ist aber auch nicht direkt berufen eine solche Debatte zu führen. Psychologen, Soziologen, Biologen sind dünn gesät in den Reihen. Pöbler, die sich in der Thematik nicht auskennen sondern Stammtischparolen weitergeben wollen bringen auch nichts. Man tut sich aber sicher auch schwer zwischen einem Faible für evidenzbasierte Wissenschaften einerseits und traditioneller Verbundenheit mit linken und grünen Strömungen Position zu beziehen.

Ich wüsste im deutschsprachigen Raum auch spontan niemanden, den ich auf einem Debattenpodium gerne sehen würde, und zwar im Sinne von überhaupt niemand, auch unter Leuten, die dem CCC fernstehen nicht.

Einen Augenblick sah es so aus, als könne Kutschera jemand sein, aber der hat sich als unsachlicher Troll erwiesen, der sich im Ton vergreift und im Segelwind der Natur einem Geburtenwahn anheimgefallen ist, verbunden mit Tendenzen, die ins rechte Lager reichen oder da her kommen. Danke, nein.

Ob es intern keine Diskussionen gegeben hat? Ich bin nicht im Club, kann es mir aber eigentlich nicht vorstellen. Ein solches Thema hat natürlich die Brisanz einen solchen Verein zu spalten. Das Thema zu vermeiden wird sich aber, so fürchte ich, rächen. Kontroversen muss man auch auszuhalten lernen, aber wo tut man das noch? Das ist aber kein Druck von außen, der die political Correctness erzwingt, sondern es ist die Konsequenz des Verhaltens von 1000 Einzelnen, die alle die neue Hymne singen: „Einigkeit statt Recht und Freiheit“.

 – Diversity & Illusion – 

English version at the middle of the page.

coc-453

Im Zalando-Tech-Lab fand am Dienstag eine Veranstaltung zu Vielfalt und Inklusion in Open-Source-Projekten statt.

Dies erinnerte mich an eine Anekdote, die ich selbst erlebt hatte.
Ein Projekt, das schon am Laufen war, als ich dazustieß, hatte einen COC (Code of Conduct, also eine gemeinsame Selbstverpflichtung sich an Verhaltensstandards zu halten die oft solche sind, wie man sie sei der Grundschule verinnerlicht haben sollte, oft noch mal für verschiedene Merkmalsträger betont  – Hautfarbe, Geschlecht, Gesundheitszustand, sexuelle Vorlieben), den es von einem verbundenen, anderen Projekt übernommen hatte, aber es war strittig, ob dieser verbindlich für die Community sei. Als ich umherfragte fanden alle diesen COC prima. Merkwürdig fand ich daran, dass es die Institutionen, die hie und da tätig werden sollten, gar nicht existierten und es gab Vorschriften für die Entwickler, obwohl es in unserem Bereich keine Entwickler gab und auch nicht geben sollte. Mein Eindruck war, dass niemand das aufmerksam und kritisch gelesen hatte, aber alle schon geübt waren solche Statements wie eine Sonntagsrede abzunicken. Weiterlesen

  – 65  € für ein Menschenleben – 

Ruben Neugebauer von Sea-Watch und Steini von SearchWing erklären, wie Seenotrettung funktioniert und wie humanitäre Organisationen die extremen Herausforderungen bei der Seenotrettung im Mittelmeer auch mit der Hilfe von Technik bewältigen können. Dabei geraten die Seenotretter selbst immer mehr in den Fokus der europäischen Politik, die den Kontinent komplett gegen Flucht abschotten will – und die Lebensretter zunehmend als Störfaktor sieht.

Quelle: Metrolaut 26 – Seenotrettung | Metronaut.de

Ausnahmsweise mal wieder eine Verlinkung. Ein Podcast, Dauer: 2:13:04