Linux vergleichen von Dateien innerhalb eines Ordners auf Dateiänderungen

Mit dem diff   Befehl unter Linux kann man sehr einfach herausfinden, welche Unterschiede es in zwei scheinbar identsichen Ordnern gibt.

Ein Anwendungsbeispiel wäre z.B. 2 Projekte miteinander zu vergleichen und die Unterschiede im Code herauszufinden.

#Ausgabe auf der Console stdout
diff -qr \
--exclude="css" \
--exclude="tmp" \
/myMaster/folder /mySlave/folder


#Pipen der Ausgabe in eine Datei oder less:
diff -ur \
--exclude="css" \
--exclude="tmp" \
/myMaster/folder /mySlave/folder | /tmp/diff.txt

PHP7 mit Ansible installieren

Mit Ansible kann man sehr einfach alle PHP7 von Ondrej’s Respository installieren mittels der Befehle:

- name: Remove old PHP7 ppa repository
  apt_repository: repo='ppa:ondrej/php-7.0' state=absent

- name: Add PHP7 ppa repository
  apt_repository: repo='ppa:ondrej/php'

- name: Install packages
  apt: pkg={{ item }} state=latest update_cache=yes
  with_items:
   - mysql-client
   - nginx
   - php7.0-cli
   - php7.0-fpm
   - php7.0-dev
   - php7.0-curl
   - php7.0-gd
   - php7.0-mbstring
   - php7.0-mcrypt
   - php7.0-mysql
   - php7.0-soap
   - php7.0-sqlite3
   - php7.0-xml
   - php7.0-zip
   - php7.0-bcmath
   - php7.0-ssh2
   - php-rrd
   - git
   - zlibc
  tags:
   - php

Analyse von sehr großen gzip/bzip2 gepackten Log-Dateien per Stream

Man kann per Stream in PHP beim verarbeiten der Daten sehr große Log-Dateien, die mehrere GB groß sind, sehr leicht analysieren mit Hilfe von Stream Compression Filter.

Damit kann die Datei ohne sie komplett in den Speicher laden zu müssen entpackt und analysiert werden beim Einlesen der Datei.

Dadurch kann man während des einlesens der Log-Datei schon nach beliebigen Stellen im Code suchen:

$file = 'X:/file.log.bz2';
$searchString = '2017-01-01';

if(file_exists($file)){
   $handle = fopen($file, 'r');
   stream_filter_append($handle, 'bzip2.decompress');
   while(!feof($handle)){
      $line = fgets($handle);
      if(strpos($line, $searchString) !== false){
         echo $line;
      }
   }
   fclose($handle);
}

MySQL Monitoriong der ProcessList / Queries mit einem Konsolen Befehl

Ein hilreicher Befehl für die problem-Analyse von MySQL Servern ist sich die ProcessList anzuschauen, um zu sehen, welche Quueries aktuell ausgeführt werden. Wenn man dies kombiniert mit dem watch Befehl und diesen 1 mal pro Sekunde neuladen lässt und auf die Queries reduziert, hat man eine guter Übersicht, was auf dem MySQL Server los ist und welche Queries problematisch seien könnten:

watch -n 1 "mysql -u root --password='XXX' -h localhost -s -e 'SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST WHERE Command=\"Query\";'"

Wichtig ist, den Befehl als root laufen zu lassen, um auch alle Queries zu sehen.

Mit Hilfe des Parameter -n kann man die Aktualisierungrate in Sekunden angeben.

Das MySQL root-Passwort ist zu ergänzen.

 

Ausgabe:

5361925476      user     localhost       NULL    Query   0       executing       SELECT * FROM xxx WHERE yyy

5361925477      user     localhost       NULL    Query   0       executing       UPDATE zzz WHERE zzz

Untersuchung des Traffics zwischen lokaler Rechner und Server am Beispiel von XDebug

Wenn man untersuchen will, was an der Kommunikation vom lokalen Rechner und Server bei XDebug nicht funktioniert, kann man sich den Traffic anschauen auf dem Port 9000, der am Server ankommt:

watch -n 1 "netstat | grep 9000"

//Ausgabe
Every 1.0s: netstat | grep 9000                                                                                          Tue Feb  7 16:01:50 2017

tcp        0      0 name:58572        host.server:9000 ESTABLISHED

und am lokalen PC kann man den Traffic beobachtet:

C:\>netstat  1 | find /i "9000"

//Ausgabe
  TCP    172.17.20.65:9000      server:58440    HERGESTELLT
  TCP    172.17.20.65:9000      server:58440    HERGESTELLT

Wenn Xdebug bis zum lokalen System kommt, erhält man eine Ausgabe wie oben sichtbar (Windows).

Bash Script um Konsolen Befehle auf mehreren Servern auszuführen

Wenn man einen Cluster von Severn administrieren muss, hilft es sehr, wenn man Befehler “in einem Rutsch” auf allen Mitgliedern des Clusters ausführen kann mit Hilfe eines einzigen Konsolen Befehls.

Wenn man z.B. den Befehl: apt-get update ausführen will auf 3 Servern, kann man folgendes Script benutzen (Dateiname ist “each” und auf dem Master abzulegen):

#!/bin/bash
echo -e "\nServer1:"
ssh serverName1$*
echo -e "\nnServer2:"
ssh serverName2$*
echo -e "\nnServer3:"
ssh serverName3$*

Der Aufruf erfolgt folgender Maßen auf der Konsole:

each "apt-get update"

Das Skript verbindet sich dann per SSH auf die Server und führt auf jedem den Befehl apt-get update aus und zeigt das Ergebnis der Operation auf der Konsole an. Vorrausetzung ist, dass die Server ohne Passwort Zugriff aufeinander haben, was in einem Cluster der Fall sein sollte. Der Befehl sollte vom Master des Clusters aus ausgeführt werden.