Beiträge von Sebbo

    Hallo,


    heute möchte ich euch gerne einen kleinen Crash-Kurs zum Thema "Shell-Programmierung" im speziellen zur "Bash" geben. Ihr werdet hier erfahren und lernen, was die Bash überhaupt ist, was man damit alles anstellen kann und vorallem wie man überhaupt ein Shell-Programm erstellt/programmiert.


    Inhaltsverzeichnis

    • Shell-Programmierung - Was bedeutet das?
    • Bash - Was ist das?
    • Warum Bash und nicht "Sh"?
    • Hinweise / Tipps & Tricks zur Shell-Programmierung
    • Beispiel Programmierung


    Gut, dann fangen wir mal von vorne an. ;)

    • Shell-Programmierung - Was bedeutet das?
      Unter Linux/Unix gibt es mehrere verschiedene Shells, wie zum Beispiel die sh, bash, dash, zsh und ksh. Alle Shells unterscheiden sich prinzipiell nur in den vorhandenen Funktionen, dem Speicherplatzverbrauch auf der Festplatte und der Herkunft. So kann die sh beispielsweise weniger als die bash und die zsh wiederum kann mehr als die sh und bash. ;)


      sh, zsh und ksh kann man übrigens wie folgt aussprechen, um nicht immer so abgehakte Wörter sagen zu müssen: shell, zshell, kshell


      Je nach Shell kann man also verschiedene Befehle und Funktionen der Shell nutzen. Wie PHP, Python und VBA zählt auch die Shell-Programmierung zum Oberbegriff "Skript". Die Shell-Programmierung wird hauptsächlich zur Automatisierung oder Vereinfachung von Prozessen benutzt. So kann man Beispielsweise ein kleines Shell-Skript schreiben, dass die Webserver Logs auswertet und entsprechend ausgibt. Ein weiteres Beispiel wäre zum Beispiel die Automatisierung von Backups. :)


      So... Und je nachdem welche Shell man eben für das Skript verwendet, heißt das entsprechend "Bash-Skript" bzw. "Bash-Programmierung" oder z.B. "KSH-Skript" bzw. "KSH-Programmierung". Wem die Namen jedoch nicht gefallen, kann es auch einfach bei dem Namen "Shell-Programmierung" bzw. "Shell-Skript" belassen. ;)


    • Bash - Was ist das?
      Wie eben erklärt, gibt es unter Linux/Unix mehrere verschiedene Shells mit mehr oder weniger Funktionen - die Bash ist so eine Shell. Die Bash ist eine Shell, die auf der sh basiert und einige nützliche Funktionen der ksh und csh implementiert, also benutzt.


    • Warum Bash und nicht "Sh"?
      Die bash deckt meiner Meinung nach die meist genutzten Funktionen, die gebraucht werden, ab und dadurch hat man weniger bzw. keine Probleme mit "unbekannter Befehl". ;)
    • Hinweise / Tipps & Tricks zur Shell-Programmierung
      Vom Prinzip ist die Shell-Programmierung ganz einfach. Man muss hierfür nur folgende Punkte beachten:

      • Shell-Skripte enden normalerweise mit der Extension/Datei-Endung "sh", wie "shell"
        Beispiel: skript.sh
        Aufbau: <DATEINAME>.sh
      • In die aller erste Zeile muss der Shebang rein (siehe auch hier: Shebang (Unix) - Wikipedia, the free encyclopedia)
        Sieht für die "bash" zum Beispiel so aus: #!/bin/bash
        Aufbau: #!<PFAD_ZUR_SHELL>
      • Variablen werden ohne führendes Dollar-Zeichen definiert
        Beispiel: TEXT="Hallo Welt!"
        Aufbau: <VARIABLEN_NAME>=<WERT>

        Hinweis:
        Variablen können während des Skriptes wahllos und einfach vom Datentyp geändert werden, indem man einfach den Inhalt der Variable ändert:
        TEXT="Hallo Welt!" (jetzt ist der Datentyp der Variable ein String)
        TEXT=123 (jetzt ist der Datentyp der Variable ein Integer)


      • Benutzung von Variablen erfolgen wie gewöhnt mit einem führenden Dollar-Zeichen
        Beispiel: $TEXT
        Aufbau: $<VARIABLEN_NAME>


      • Befehle, die auf der Shell funktionieren, funktionieren auch im Shell-Skript
        Beispiel: free -mt (gibt Auskunft über freien und genutzten RAM vom System)
        Aufbau: <Shell_BEFEHL>
      • IF-Abfragen sind ähnlich aufgebaut wie in anderen Sprachen:
        Beispiel: if [[ $(ping example.com -c1) ]]; then echo 'example.com ist erreichbar!'; else echo 'example.com ist NICHT erreichbar!'; fi
        Aufbau: if [[ <ÜBERPRÜFUNG> ]]; then <WENN ERFOLGREICH TUE...> fi
        Erklärung: "if" startet eine IF-Abfrage | "THEN" sagt "wenn erfolgreich, dann mache..." | "ELSE" sagt "wenn nicht erfolgreich, dann mache..." | "FI" beendet die IF-Abfrage


        Das Beispiel überprüft übrigens per PING, also ICMP-Paket, ob der Host "example.com" erreichbar ist und falls ja gibt es "example.com ist erreichbar!" aus - falls nicht "example.com ist NICHT erreichbar!". ^^


      • Sollte was nicht funktionieren gibt es mehrere Debug-Modes, die man in die zweite Zeile des Shell-Skriptes reinschreiben muss. Ich empfehle hier die ausführlichere Version: set -x
      • Damit das Shell-Skript auch funktioniert, muss es nach dem Anlegen/Speichern auch ausführbar sein. Dazu kann man das "execute" Bit (= x) setzen: chmod +x skript.sh
      • Ausführen/Starten des Shell-Skriptes, wenn es ausführbar ist: ./skript.sh


    • Beispiel Programmierung
      Als kleines Beispiel möchte ich hier zum Verständnis noch ein paar kleine Skripte zeigen:


      Beispiel 1)
      Dateiinhalt: cat ./beispiel_skript.sh

      Bash
      #!/bin/bash# Dies ist eine Kommentarzeile# Und noch eine Kommentarzeile, die vom Skript ignoriert wird# PS: Kommentarzeilen mit einem Ausrufezeichen werden als Shebang angesehen und NICHT ignoriert! (also die erste Zeile z.B. ;))# Überprüfe, ob example.com erreichbar istDOMAIN="example.com"if [[ $(ping $DOMAIN -c1) ]]; then    # Domain ist erreichbar :)    echo "$DOMAIN ist erreichbar!";else     # Domain ist nicht erreichbar :(    echo "$DOMAIN ist NICHT erreichbar!";fi


      Ausführbar machen:

      Code
      chmod +x beispiel_skript.sh


      Skript ausführen:

      Code
      ./beispiel_skript.sh


      Zitat von Ausgabe

      example.com ist erreichbar!


      Beispiel 2)
      Dateiinhalt: cat ./beispiel_skript.sh

      Bash
      #!/bin/bash# Rechnen wir etwas ;)# Man kann die Variablen schreiben wie man möchte: klein, groß, klein und groß# Werte einer Variable zuweisenWERT_1=5WERT_2=10WERT_3=20#Gebe die Werte nacheinander ausecho $WERT_1echo $WERT_2echo $WERT_3echo# Der Variable "SUMME" die Summe der Werte 1 und 2 zuweisenlet "SUMME = WERT_1 + WERT_2"echo "$WERT_1 + $WERT_2 = $SUMME"echo "Wert 3 = $WERT_3"let "Summe_Neu = $SUMME - $WERT_3"echo "$SUMME - $WERT_3 = $Summe_Neu"


      Skript ausführen:

      Code
      ./beispiel_skript.sh


      Zitat von Ausgabe

      5
      10
      20


      5 + 10 = 15
      Wert 3 = 20
      15 - 20 = -5


    Das war's dann auch schon wieder. Ich hoffe, ich konnte euch die Shell-Programmierung etwas näher bringen. Sollte es Fragen geben, könnt ihr diese gerne hier unten als Antwort/Kommentar erstellen. :)


    Hier geht es zum nächsten Teil: [Bash-Programmierung] Umleitungen, grep und Co.

    Okay... Hab es jetzt mal wie folgt gelöst:



    Das speichert mir quasi die "neuen" Bytes der Voice- und Filetransfers zum vorherigen Datensatz aus der Datenbank in die Datenbank.


    Sieht dann so aus:

    Hallo,


    ich persönlich bin auch für einen facebook Login, da wir so noch mehr Mitglieder kriegen könnten.


    Wie Phil bereits gesagt hat, ist in wbb4 eh schon standardmäßig alles mit facebook, twitter, Google+ und Co. verbaut, von daher macht es auch nichts, wenn wir noch den Login dazu bereitstellen. :)


    @Thomas und @PhiL was sagt ihr dazu? Ja, einbauen oder nein, nicht einbauen? :)

    bzw für bytes:


    "connection_filetransfer_bytes_sent_total"
    "connection_filetransfer_bytes_received_total"


    Oh, hab ich irgendwie übersehen. :D


    Da ist alles dabei was man normalerweise braucht->Ohne zu rechnen


    Joa... Da hast du wohl Recht. :D


    Gut. Dann kann ich ja jetzt die Voice- und Filetransfers einfach auslesen. :)


    Noch eine Frage zu aktuellen bestehenden Tabelle: Sollte ich die Datenbandbreitennutzung in kbit/s oder anders speichern, wenn ich die Voice- und Filetransfers dann parallel dazu abbilden möchte?


    PS: Falls es ein anderes Format haben sollte: Welches und wie komme ich von kbit/s da drauf? :D

    Okay... Hab folgendes gefunden:

    Code
    $ serverinfo[...]connection_bytes_sent_total=18180305860connection_bytes_received_total=24092993600connection_bytes_sent_speech=17750086364connection_bytes_received_speech=23656133699[...]


    Und dann kann man ja die Filetransfers ausrechnen - oder nicht?

    Code
    FILETRANSFER_BYTES_TOTAL = (connection_bytes_sent_total + connection_bytes_received_total) - (connection_bytes_sent_speech + connection_bytes_received_speech)


    Somit erhält man folgende Gleichung:

    Code
    FILETRANSFER_BYTES_TOTAL = CONNECTION_BYTES_TOTAL - CONNECTION_BYTES_SPEECH

    Sorry, kam leider nicht früher dazu zu antworten. :(


    Nachfolgend die Informationen, die meines Wissens nach ausreichen sollten bzw. gebraucht werden:

    • Host

      • Linux Debian 7.4 3.2.0-4-amd64
    • Netzwerk

      • 1 GBit Vollduplex (Ethernet controller: Red Hat, Inc Virtio network device => vServer)
    • Bash-Shell
      • GNU bash, Version 4.2.37(1)-release (x86_64-pc-linux-gnu)
    • PHP (wird eigentlich nicht benötigt, da ich es als Shell-Skript haben möchte)

      • PHP 5.4.4-14+deb7u8 (cli) (built: Feb 17 2014 09:18:47)
        Copyright (c) 1997-2012 The PHP Group
        Zend Engine v2.4.0, Copyright (c) 1998-2012 Zend Technologies
    • Datenbank: MySQL
      • mysql Ver 14.14 Distrib 5.5.35, for debian-linux-gnu (x86_64) using readline 6.2
      • Tabellenaufbau für Netzwerk-Traffic:

        Diese Tabelle wird noch entsprechend um die benötigten "Spalten" Voice- und Filetransfer Traffic erweitert. Dazu müsste ich aber erstmal wissen, in welchem Format die Daten vorliegen und ob ich es doch nicht in eine extra Tabelle auslagere... ;)
    • Webserver
      • Server version: Apache/2.2.22 (Debian)
        Server built: Feb 1 2014 21:26:04
      • Erweiterungen

        • mysqli

    Soviel zu den Informationen... Da ich alle anderen Analysen als Shell-Skript gebaut habe, würde ich auch diese Analyse als Shell-Skript vorliegen haben. Bisher sind alles Bash-Skripte um genau zu sein, aber wenn es nicht anders geht, nehme ich natürlich auch gerne eine andere Lösung entgegen. Ziele ist nur, dass die Analyse dann voll automatisiert in die Datenbank gespeichert werden kann - bei Shell-Skripts kann ich das über die Cronjobs regeln. Bei PHP-Skripten sollte das normalerweise auch so gehen... :)


    Ich zeig euch einfach mal nachfolgend den Code für die Analyse des Netzwerk-Traffics:


    So... Ich hoffe mir kann jemand helfen. :)

    Win. 7 braucht mit einer SSD auch nur etwa 4-6 sec.


    Diese SSD musst du mir zeigen, die so krass schnell Windows vollständig bootet...


    Zudem ist nicht die Rede von einem "nackten" Windows, sondern von einem benutzten, wo auch Spiele, Antivirenscanner, Firewalls, Adobe Photoshop, Windows-Updates und weitere Softwares drauf installiert sind. Bei einem "nackten" Windows ohne installierte Updates (ohne SP1) bootet Windows 7 auch bei mir innerhalb von 12 Sekunden, aber nicht innerhalb von 6... Meine Zeit ist auch nicht vom Windows Bootvorgang gemessen, sondern vom Knopfdruck auf "Einschalten" des Rechners...


    Meine SSD ist nicht gerade schlecht und hat folgende Eckdaten:

    Zitat von Herstellerdaten

    Kapazität 240GB
    Seq. Lesen (max.) 550MB/s
    Seq. Schreiben (max.) 510MB/s
    Zuf. Lesen (max.) 95K IOPS
    Zuf. Schreiben (max.) 78K IOPS
    MTBF 2,0. Mio. Stunden


    Und nur so nebenbei: Die Server SSDs für einen Wert von 1.500 € pro SSD kauft sich keiner für seinen heimischen Desktop Rechner. ;)

    Hallo,


    ich finde Windows 8.x insgesamt besser. Die Kacheln sind natürlich gewöhnungsbedürftig, aber das ist schnell vorbei. Nach einer Woche hatte ich mich eigentlich vollständig dran gewöhnt.^^


    In dem Punkt mit dem Starten von Softwares muss ich Manu mehr oder weniger zustimmen. Ob du jetzt die Schritte hier...

    • Start Menü öffnen
    • Programmliste öffnen
    • Programm starten

    oder diese hier...

    • Windows-Taste drücken um zu den Kacheln zu kommen
    • Software-Kachel finden und anklicken

    durchführst kommt am Schluss auf's selbe raus. (Zeitlich gesehen...)


    Man muss natürlich seine Kacheln entsprechend richtig anordnen und auch wissen, wo man dann was hin getan hat, sonst dauert das unter Umständen 10x so lange. :D


    Zum Task-Manager: Ich finde den absolut geil. Ich weis nicht, was daran "verkompliziert" wurde, aber er ist bedeutend übersichtlicher und zeigt auch mehr Infos an als die vorherigen bis zu Windows 7. Den Task-Manager von Windows 8.x hätte ich auch gerne in Windows 7. :D


    Der klare Vorteil von Windows 8.x ist natürlich das neue Dateisystem, dank dem es nochmal doppelt so schnell als NTFS (also das von Windows 7 z.B.) ist. Ein Kollege von mir hat mal einen Test gemacht, indem er auf eine SSD Windows 7 und einmal Windows 8.x installiert hat - mit den selben Zusatzsoftwares wie Virenscannern, Firewalls und Co.. Windows 8.x bootet im Gegensatz zu Windows 7 um mindestens das 2-fache schneller. Sein Windows 7 brauchte circa 21 Sekunden, während sein Windows 8.x innerhalb von 8 Sekunden hochgefahren war. :D


    PS: Mit "Hochfahren" ist die Rede aus dem Kalt-Start und nicht aus einem Hibernate-Modus wie "Standby" oder sowas... ;)