Bash: Ausführungszeit eines Kommandos in Millisekunden messen

Dienstag, 14. Juli, 2020

Wenn man im Monitoring einen Check schreiben will, der die Antwort-Zeit einer Aktion oder Response eines Servers messen will, sind sekundengenaue Angaben zu grob. Mit dem Kommando

time [Kommando]

kann man sehen, wie lange das jeweilige Kommando brauchte:

$ time ls
[... Liste von Dateien ...]

real    0m0,022s
user    0m0,000s
sys     0m0,015s

Die Gesamtzeit ist in der Zeile real enthalten. Angegeben sind die Minuten, ein “m” und danach die Sekunden mit 3 Nachkommastellen. Wobei die Tausendstel je nach System/ Sprache mit Punkt oder Komma getrennt sein könnten.

Aha, nun muss man “nur” noch die Zeile mit der Angabe “real” in den letzten 3 Zeilen der gesamten Ausgabe suchen und das Ganze parsen.

Als kleines Demo anbei einmal mundgerecht als Funktion (es läuft unter Linux und mit CYGWIN unter MS Windows):

#!/usr/bin/env bash

# ------ FUNCTION

# measure time in ms
# @param  string  command to execute / measure
function getExecTime(){
	local sCommand=$1
	local tmpfile=$( mktemp )

	( time eval $sCommand ) >$tmpfile 2>&1
	local sRealtime=`cat $tmpfile | tail -3 | grep "^real" | awk '{ print $2 }'`
	rm -f $tmpfile

	local iMin=`echo $sRealtime | cut -f 1 -d "m" `
	local iMillisec=`echo $sRealtime | cut -f 2 -d "m" | sed "s#[.,s]##g" | sed "s#^0*##g" `
	typeset -i local iTime=$iMin*60000+$iMillisec
	echo $iTime
}

# ------ MAIN

echo
echo "ZEITMESSUNG IN MILLISEKUNDEN"
echo
mytime=`getExecTime 'ls -ltr'`
echo Dauer: ${mytime} ms

Manjaro: Update-Skript

Freitag, 1. Mai, 2020

Ein kleines Snippet von mir zum Updaten der Linux-Distro Manjaro.

Es aktualisiert die Softwarepakete der Distribution (Kernel, Programme u.s.w.) - danach aus den AUR (Arch User Repository) installierte Programme. Zum Schluss werden nicht benötigte Pakete entfernt.

Es werden noch Zwischenabfragen gestellt, die mit Yes oder No zu beantworten sind. Mit Auskommentieren der Zeile answer=Y kann man es teilautomatisieren, jedoch pamac wird immer eine Interaktion bedürfen und das Passwort erfragen.

#!/usr/bin/env bash

answer=
# answer=Y

# ------------------------------------------------------------
# FUNCTIONS
# ------------------------------------------------------------
function header(){
    echo; echo; echo "========== `date` - $*"; echo
}

# ------------------------------------------------------------
# MAIN
# ------------------------------------------------------------

echo "______________________________________________________________________"
echo
echo
echo "Axels Manjaro update script"
echo
echo "______________________________________________________________________"

header "SYSTEM UPDATE"
echo $answer | sudo pacman -Syyuu

header "Update incl. AUR..."
pamac upgrade -a

header "CLEANUP - remove unneeded packages"
echo $answer | pacman -Qdtq && sudo pacman -Rs $(pacman -Qdtq)

header "DONE."

# ------------------------------------------------------------

Nachtrag:

Wer es ein wenig bunter mag, der kann in der /etc/pacman.conf in der Sektion [options] diese 2 Einstellungen aktivieren:

[options]
(...)
Color
ILoveCandy
(...) 

UPDATE:

  • pamac does not run as root but in user context. So sudo was removed.

weiterführende Links:

  1. manjaro.org Startseite der Linux Distribution
  2. wiki.manjaro.org: AUR
  3. wiki.manjaro.org: pacman
  4. wiki.manjaro.org: Pamac

SSD Einbau in Laptop Acer E 15

Sonntag, 29. März, 2020

Ich habe beim Laptop - ein Acer Aspire 15 mit Winows 10 - die Performance verbessern wollen. Und fing bei der SSD an…

Vorbereitungen

Eingebaut war eine Festplatte mit 1 TB. Also habe ich eine SSD gleicher Grösse gekauft.

2020-03-29-ssd-into-acer-aspire-ee15-01.jpg

Da mit dem Ausbau des Datenträgers alle Daten “weg” (auf dem dann ausgebauten Datenträger) sind, muss man die komplette Festplatte mit einem Backup-Programm sichern. Ich habe das Backup auf eine externe USB Disk gemacht. In meinem Fall hatte ich eine Festplatte mit

  • Recovery Daten (von Acer+MS)
  • System-Partition C (ca. 500 GB)
  • Daten Partition D (ca. 500 GB)

Mit einem System-Image für Recovery und C: und einem Partitions-Image brauchte es 2 Backups:

2020-03-29-backup-system.jpg 2020-03-29-backup-data.jpg

Und sofern noch nicht zur Hand: man kann sich auch ein bootbares Medium der Backup-Software erstellen. Das wird man gleich brauchen :-)

[Weiterlesen…]

Bash Snippet: Alter einer Datei

Montag, 9. März, 2020

Ein Mini-Schnipsel fürs Shell-Skripting. Nach Angabe einer Datei bekommt man mit nachfolgender Funktion das Alter in Sekunden.

# get age of a file in sec
# param  string  filename to test
#
function _getFileAge(){
    echo $(($(date +%s) - $(date +%s -r "$1")))
}

Als Beispiel:

myfile=/tmp/whatever.txt

typeset -i iAgeLastGet=`_getFileAge "${myfile}"`
echo "INFO: The file ${myfile} is ${iAgeLastGet} sec old ..."

Bash Rest API Client

Dienstag, 3. März, 2020

Ich bin an unserem Institut am Neuaufbau des Monitorings mit ICINGA dran. Weil es so empfohlen wird, kommt das Director Modul zum Einsatz. Ach so, bereut habe ich dies nicht.

Das Monitoring funktioniert über passive Checks: jeder Server meldet sich selbst an und sendet seine Monitoring Daten zu Icinga ein.

Jeder unserer Server soll ein Host Objekt anlegen, die bemötigten Service-Objekte und und die Services mit dem Host-Objekt verknüpfen. Dazu “spricht” jeder Server per REST API mit dem Director. Der muss die Konfiguration zum Icinga-Server deployen.

Zum Einsenden der Daten braucht es den bereitgestellten Slot für den Host+Service auf dem Icinga-Service. Der Client spricht zum Einliefern der Monitoring-Daten ebenfalls mit einer REST-API - aber dann mit der des Icinga Daemons.

Zum Abstrahieren der REST-API Zugriffe auf verschiedene APIs habe ich alles rund um Http abstrahiert und eine Bash-Komponente geschrieben, die diverse Funktionen für Http-Zugriffe und Abfragen in Skripten einfacher verfügbar macht. Die Verwendbarkeit in Skripten war der Fokus. Die Funktionen ähneln vom Aussehen Methoden einer Klasse: “http.[Funktion]”.
Macht man einen Http-Request, so bleibt dessen Antwort im RAM. Bis man den nächsten Request macht - oder die Shell / das Skript beendet.
Weil es ein Wrapper von Curl ist, kann man alle Http-Methoden, wie GET, HEAD, POST, PUT, DELETE verwenden.

Um einen ersten Eindruck zu vermitteln:

http.makeRequest GET https://www.axel-hahn.de/

Diese Aktion erzeugt keine Ausgabe.

Man kann dann mit Funktionen den Statuscode abfragen, den Http Response Header, den Body oder aber die Curl Daten (darin sind z.B. Upload- und Download-Speed und Verbindungszeiten).

http.getResponseHeader

… gibt alle Http-Response-Headerzeilen aus.

http.getStatuscode

… zeigt den Statuscode

http.isOk

… testet, ob die Anfrage mit einem 2xx Code zurückkam.

Für Icinga wurde der Zugriff mit Basic Authentication umgesetzt.

GET Abfragen lassen sich für N Sekunden cachen. Darüber hinaus kann man den Response exportieren und wieder importieren. Nach dem Import kann man wiederum den Response mit allen Funktionen erfragen - mit http.getRequestAge holt man sich das Alter der Ausführungszeit des Requests. Man kann ein Debugging aktivieren, um die interne Verarbeitung offenzulegen und nachzuvollziehen.

Und Einiges mehr.

Falls das für euch interessant klingt, schaut euch das Bash-Skript doch einmal an.

weiterführende Links:

  1. Gitlab: iml-open-source/bash-rest-api-client
  2. Icinga Open Source Monitoring Tool
  3. Icingaweb - Director REST API
  4. Icinga: REST API

Fish - SSH-Agent initial starten

Mittwoch, 22. Januar, 2020

Meine beiden Manjaro Instanzen im Büro und daheim habe ich auf fish als Default-Shell umgestellt.
Nun wollte ich in der Konsole beim ersten Aufruf einer Shell den SSH Agent mitsamt meines SSH Keys starten lassen.

(1)
Dazu muss man einmal den “Ersatz” der ~/.bashrc finden - das wäre die Datei ~/.config/fish/config.fish. Wenn man als Newbie mit fish startet und noch gar nichts auskonfigriert hat, so exisitiert diese Datei nicht. Man muss sie anlegen.

(2)
Trick 2 ist die Meisterung des Starts des SSH-Agents. Unter fish wäre es mit

eval (ssh-agent -c)

aufzurufen.

(3)
Was mir beim Schreiben des allerersten 5-Zeilers so auffiel: die Syntax von fish untescheidet sich durchaus zu anderen Shells, wie sh, ksh oder bash: hier gibt es keinen Abschluss mit “fi” oder “esac”, aber davon verabschiedet man sich sicher gern. Und statt $? ist die Variable $status.

Hier mein kleines Snippet:

cat ~/.config/fish/config.fish
# ----------------------------------------------------------------------
# Start SSH agent with my default key
# ----------------------------------------------------------------------
ps -ef | grep -v grep | grep "ssh-agent -c" >/dev/null
if test $status -ne 0
     echo "SSH-Agent wird gestartet..."
     eval (ssh-agent -c)
     ssh-add ~/.ssh/id_rsa
end

# ----------------------------------------------------------------------

Update:

  • Nach dem Holen der Prozessliste wurde noch ein
    grep -v grep

    eingefügt.

weiterführende Links:

  1. fishshell.com - Webseite
  2. Docs

Geschlechterfarben

Donnerstag, 2. Januar, 2020

Mädchen bekommen alles in rosa … Jungen in blau … oder war es umgekehrt?

2020-01-02-headphones-4-kids.jpg