Bash: Ausführungszeit eines Kommandos in Millisekunden messen
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
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:
- manjaro.org Startseite der Linux Distribution
- wiki.manjaro.org: AUR
- wiki.manjaro.org: pacman
- wiki.manjaro.org: Pamac
SSD Einbau in Laptop Acer E 15
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.
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:
Und sofern noch nicht zur Hand: man kann sich auch ein bootbares Medium der Backup-Software erstellen. Das wird man gleich brauchen :-)
Bash Snippet: Alter einer Datei
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
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:
- Gitlab: iml-open-source/bash-rest-api-client
- Icinga Open Source Monitoring Tool
- Icingaweb - Director REST API
- Icinga: REST API
Fish - SSH-Agent initial starten
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:
Geschlechterfarben
Mädchen bekommen alles in rosa … Jungen in blau … oder war es umgekehrt?