Ein Lockfile im Shell-Script

Gute Vorschläge und Ideen um Lock-Files in einem Shell-Script zu verwenden, gibt es wie Sand am Meer.

Es gehen – mittlerweile seit Jahren – tiefgreifenden Diskussionen einher, welche Variante nun die Sicherste ist und welche Scripts Race-Conditions haben.

Meine persönliche Variante, die sicherlich nicht im Millisekunden-Bereich stabil ist, ist die folgende:

Über die erste Zeile hole ich mir einen Lockfilenamen in /tmp der den Namen des Scripts+“.lock“ hat.

Das kill -0 prüft schlicht, ob der Prozess der das „Lock“ hat, auch tatsächlich noch läuft.

Trap sichert noch ab, daß, außer bei einem kill -9, das Lockfile auch gelöscht wird 🙂

Jenkins

Da ich in der Vergangenheit Jenkins bei vielen Kunden aufgebaut und/oder erweitert habe, zudem Plugin-Maintainer bin, werde ich jetzt hier auf dem Blog in Zukuft einfach mal eine Serie mit Tips- und Tricks zu Jenkins veröffentlichen 🙂

Die Artikel werden etwas chaotisch veröffentlicht, je nachdem wieviel Zeit ich habe, aber zum Schluß wird es für diverse Bereiche nochmals eine Zusammenfassung nach Themengebieten geben.

Bei Anregungen/Wünschen: einfach hier einen Kommentar hinterlassen 🙂

px3

SSL Einstellungen auf dem Apache (Drown)

Das Thema SSL mit Let’s Encrypt werde ich zwar erst in einem später Blogeintrag thematisieren, aber durch die aktuelle Problematik wegen DROWN, schreibe hier doch mal etwas zum Thema SSL.

Viele Webserver die im Netz verfügbar sind, sind leider mehr als suboptimal konfiguriert, was nun gerade durch das beeindruckende DROWN-Problem und dem Anbieter Server4You mehr als deutlich wird.

Laut BSI (Bundesamt für Sicherheit in der Informationstechnik) sind alleine in Deutschland 245.000 IPs betroffen.

Wenn man nun eine Seite mit SSL betreibt, sollte man sie zumindest einmal prüfen lassen, ob der Webserver wirklich richtig konfiguriert ist.
Einen kostenlosen und mehr als umfangreichen Test gibt es bei: Qualys SSL Labs

Aber zunächst einmal frisch ans Werk 🙂

Um das Drown-Problem zu lösen, ändert man in seiner ssl.conf im Apachen die Zeile mit dem SSLProtocol wie folgt ab:

Dazu noch in der selben Datei die default Zeile SSLCipherSuite wie folgt

abändern und schon hat man mit dieser kleinen Änderung, gefolgt von einem

das Drown-Problem gelöst.

 

Wem nun noch seine CypherSuites wichtig sind, weil Qualys SSL Labs, die Seite nur als A- einstuft, kann mit der folgenden Änderung in der ssl.conf

seine Probleme lösen.

 

Mehr zum Thema Zertifikate kommt demnächst, wenn ich über Let’s Encrypt schreibe. 🙂

Icons bei einem Screensaver unter OS X

Da ich ja jetzt die weitere Entwicklung von RedPill übernommen habe, bin ich auf ein mehr als illustres Problem gestoßen 🙁

Der normale Weg einer App unter OS X ein Icon mitzugeben, ist schlicht ein AppIcon-Set unter Assets.xcassets zu erstellen, was dann im XCode so aussieht:

Bildschirmfoto 2016-03-03 um 12.30.58

Die Icons werden auch brav angezeigt, aber in den Bildschirmschonereinstellungen ist auf einmal nur das DefaultIcon von OS X zu sehen 🙁 Bildschirmfoto 2016-03-03 um 12.49.00

In der Dokumentation vom XCode war auch nichts zu finden, was zu einer Lösung des Problems geführt hätte.

Eine Recherche im Netz brachte auch nur den bereits beschriebenen Weg zu Tage.

Irgendwo in den gaaaanz tiefen Tiefen des Internet, hab ich dann die Lösung gefunden.

Man muß seinem Projekt schlicht und ergreifend noch 2 PNG Files, mit dem sprechenden Namen thumbnail mitgeben.

Also habe ich die beiden Datein erstellt:

  1. thumbnail.png mit einer Auflösung von 90 x 58 Pixeln
  2. thumbnail@2x.png mit einer Auflösung von 180 x 116 Pixeln für die Darstellung auf einem Retina-Display

Und siehe da: schon wurde auch in den Bildschirmschonereinstellungen eine kleine Vorschaugrafik angezeigt, wie auf diesem Bild links unten zu sehen:

ScreensaverSettings

Matrix Screensaver auf dem MAC

Mein Lieblingsbildschirmschoner auf dem MAC war schon immer RedPill 🙂

Bildschirmfoto 2016-02-28 um 14.39.24

Der frühere Entwickler (mathew) hatte anscheinend keine Lust mehr, wegen vieler Änderungen in der Politik von Apple.
Er hat freundlicherweise den Quellcode unter GPL gestellt und auch den Link auf Github zu den Sourcen publiziert.

Da ich den Bildschirmschoner mag, hab ich mir gedacht, ich portiere den einfach mal auf XCode 7.xx und >OSX 10.6.

Den Fork des Quellcodes findet Ihr auf Github

Ich gedenke den Code auch weiterhin zu pflegen und für neuere OS-Versionen verfügbar zu machen.

Ein Binary für den MAC findest Du hier. 🙂

Und nochmals vielen Dank an Mathew für einen mehr als genialen Bildschirmschoner in den Jahren 2002 bis 2012 🙂

 

Git mit zentralem Repository

Auch wenn Git eigentlich ein verteiltes Versionskontrollsystem ist, gehe ich immer gerne den Weg und richte zunächst ein zentrales Master Repository ein, an das sich alle Clients connecten.

Auf dem zentralen Master wird zunächst Git installiert (bei mir auf einem Debian System):

Unter Debian wird ein neues Verzeichnis unter /var/cache/git automatisch angelegt, in dem man das zentrale Repo ablegen sollte

Das frisch erstellte Master Repository ist nun für jeden, der Zugriff auf den Server hat, über ssh://<server>/var/cache/git/YourGitRepository.git verfügbar 🙂

 

Auf den Client, mit installiertem Git, wird nun das Master Repo gecloned.
Ich habe mir auf meinem Mac ein Verzeichnis GIT im home Directory angelegt und dann einfach das MasterRepo gecloned:

Und damit ist schon einmal der erste Teil fertig. 🙂

 

Praxistest

Was fängt man nun mit so einem zentralen Repo an ?

Ich habe ein paar Linux Server an verschiedenen Standorten stehen, dazu noch zwei Entwicklungs Macbooks und ein paar Windows-Büchsen.

  • Grundsätzlich möchte ich nicht, daß Git direkt auf meine im Betrieb laufenden Umgebungen schreiben darf (Also quasi „On the fly“ Umgebungen verändert)
  • Ich möchte von sämtlichen Servern und auch vom Notebook aus einen PUSH ausführen können
  • Ich möchte von sämtlichen Servern einen PULL ausführen können, um Änderungen einspielen zu können

Ich möchte die Verwendung des zentralen Repos hier am Beispiel eines Verzeichnisses auf dem Server aufzeigen.

Zunächst einmal , ein installiertes Git ist natürlich Vorraussetzung 🙂 , in das Verzeichnis wechseln, in dem die Dateien liegen, die man in das zentrale Repo hinzufügen möchte.
Dann dort einfach folgendes ausführen:

Jetzt wurde in dem Verzeichnis eine .git-Struktur erstellt, was man auch leicht mit

überprüfen kann.

Vor dem hinzufügen der Dateien zum Git muß man jetzt zunächst sein zentrales Repository hinzugen, was recht simpel geht.
Befindet sich das Verzeichnis/die Datei die man hinzufügen möchte auf dem Server mit dem zentralen Repository reicht ein:

Ist der Server mit dem zentralen Repository auf einer anderen Maschine nimmt man:

Als Nächstes werden mit

sämtliche Dateien aus dem Verzeichnis hinzugefügt.

Um die Dateien nun auch in das zentrale Repository einzufügen reicht ein simpler

 

Auf dem Client reicht nun ein einfacher

in dem entsprechenden Verzeichnis, das man vorher mittels

erstellt hatte.

 

Fazit

Eine recht simpel und einfach zu nutzende Möglichkeit, um ein zentrales Repository mit Git zu betreiben.
Empfehlenswert.

 

Bücher zu dem Thema

Bei Amazon gibt es zwei recht gute Bücher zu dem Thema. Wem also mein kurzer Blogeintrag nicht hilft und unbedingt mehr lesen möchte:


Antivirus auf dem MAC ?

Macht ein Antivirus-Programm auf einem MAC eigentlich irgendeinen Sinn ?

OK, in sämtlichen Windows- oder Linux-VMs die ich auf dem MAC so neben laufen lasse, sind immer irgendwelche Virenscanner aktiviert.

Bei den Linux-VMs hat sich seit mehr als 4 Jahren nichts ergeben. Die Windows VMs schlagen regelmässig an.

Aber was ist mit dem MAC selbst ?

Auf Wunsch habe ich vorhin einmal ein Antivirus-Programm über meinen kompletten MAC, der – nur so nebenbei bemerkt – seit 4 Jahren ohne so einen Unfug auskommt, rennen lassen.

Das Ergebnis hat mich nicht überrascht: 300GB und 1 Stunde später…

ES WURDE EIN VIRUS GEFUNDEN !

Bildschirmfoto 2016-02-25 um 18.23.30

Also sind MACs auch anfällig für Viren ?

Ich kann da beruhigen, das gefunde VIRUS ist eine Version von „0zapftis“.
Wem das Nichts sagt: das ist der sogenannte Bundestrojaner, den ich in einer Version zu Analysezwecken auf meinem MAC liegen habe.
Also weder aktiv noch sonst irgendwie schädlich – außer das man graue Haare ob der Unfähigkeit deutscher Behörden bei der Analyse bekommt 🙂

 

Fazit

Mein Macbook rennt nun schon 4 Jahre ohne Antvirusprogramm, es wurde weder ein Virus noch nicht einmal ansatzweise irgendwas Richtung AdWare gefunden.
Der Virenscanner wird nun sein Dasein irgendwo in der Versenkung fristen, weil benötigt wird er auf einem MAC nicht.

Macbook Pro 2012 SSD und Speicher aufrüsten

Mein Macbook Pro 15″ (2012) mit 8 GB RAM und einer 500GB HDD schwächelte etwas, wenn ich sehr viele Programme geöffnet hatte.
2 Entwicklungsumgebungen, 3 VMs, ca. 60 Browsertabs verteilt über 3 Browser, SQLDeveloper, eine laufende MysqlDB und diverse offene Terminalsessions brachten das gute Teil ein wenig ans Limit.

Es stand also zur Entscheidung: ein Neues kaufen oder Aufrüsten.

Nachdem ich mir die Preise für ein neues Macbook mit 16GB RAM und einer 1TB SSD angeschaut hatte, war klar: Aufrüsten ist deutlich günstiger.

 

Arbeitsspeicher

Die erste Frage die sich mir stellte, ob man in das 2012er Macbook Pro überhaupt 16GB RAM einbauen kann – laut Apple gehen maximal 8GB RAM in das Gerät -, wurde nach kurzer Recherche im Netz geklärt: ja es gehen wirkich 16 GB RAM, sofern man den richtigen Speicher verwendet.

Möglicher Speicher für das Macbook Pro 2012 Preis
Kingston KVR16S11K2/16 Arbeitsspeicher 16GB (DDR3 Non-ECC CL11 SODIMM Kit, 204-pin 1.5V) 71,- €
Samsung 16GB Dual Channel Kit 2 x 8 GB 204 pin DDR3-1600 SO-DIMM (1600Mhz, PC3-12800S, CL11) 100,- €
Corsair 16GB (2x8GB) DDR3 1600 MHz (PC3 12800) Laptop Arbeitsspeicher (CMSO16GX3M2A1600C11) 85,- €
Crucial ram memory 16GB kit (2 x 8GB) DDR3 PC3-12800,1600MHz for 2012 Apple Macbook Pro’s 89,- €
Hynix 16GB Dual Channel Kit 2 x 8 GB 204 pin DDR3-1600 SO-DIMM (1600Mhz, PC3-12800, CL11, 1.35V) 100,- €
Preise Stand Februar 2016

 

 Die passende SSD

Da für mich zwar von Anfang feststand, daß es eine 1TB SSD sein soll, möchte ich der Vollständigkeit halber hier die möglichen SSDs ab 500GB auflisten, die ich guten Gewissens empfehlen kann.

GB ca. Hersteller Preis
 500 Samsung 850 Pro interne SSD 512GB (6,3 cm (2,5 Zoll), SATA III)
227,- €
Samsung 850 EVO 6,4 cm (2,5 Zoll) 500GB interne SSD (SATA III)
170,- €
Samsung 840 Pro Series SSD-Festplatte 512GB (6,4 cm (2,5 Zoll), 512MB Cache, SATA III)
330,- €
Samsung 840 EVO Basic SSD-Festplatte (6,3 cm (2,5 Zoll) (500GB, 512MB Cache, SATA III)
320,- €
Crucial MX200 500GB interne SSD (6,4 cm (2,5 Zoll) 7 mm, SATA III) 165,- €
Crucial BX100 500GB interne SSD (6,4 cm (2,5 Zoll) 7mm, SATA III) 160,- €
1000 Samsung 850 Pro interne SSD Festplatte 1TB (6,3 cm (2,5 Zoll), SATA III) schwarz 419,- €
Samsung 850 EVO interne SSD 1TB (6,4 cm (2,5 Zoll), SATA III) schwarz 300,- €
Crucial MX200 1000GB interne SSD (6,4 cm (2,5 Zoll) 7mm, SATA III) 336,- €
Crucial BX100 1000 GB (6,4 cm (2,5 Zoll) 7mm, SATA III) 350,- €
2000 Samsung 850PRO SSD 2TB (6,4 cm (2,5 Zoll), SATA III) 869,- €
Samsung 850EVO SSD 2TB (6,4 cm (2,5 Zoll), SATA III)
637,- €
Preise Stand Februar 2016

 

Was braucht man noch, bevor man mit dem Einbau beginnen kann ?

Wie mittlerweile üblich, benötigt man für das Öffnen von Handys oder Computern leider immer ein Spezialwerkzeug 🙁
Um das Macbook auf der Unterseite zu öffnen, bedarf es eines PH00 Schraubenziehers (7 €).
Da ich mir nun nicht wirklich für jede Bastelei an diversen Geräten von Apple neue Einzelwerkzeuge kaufen mag, habe ich mich für das Mini Schraubendreher Set (12 €) von HAMA entschieden, weil es alles an Schraubendrehern anbietet, die man für die Bearbeitung von Apple Geräten benötigt.

RAM, Werkzeug, SSD sind also da, nur irgendetwas fehlt noch: die Daten von der alten HDD müßen ja irgendwie auf die neue SSD.
Es fehlt noch ein externes Gehäuse, in das man zunächst die SSD für das Überspielen der Daten von der HDD einbaut und später als Timemaschine Backup mit der alten HDD verwenden kann.
Hierfür gibt es ein günstiges externes USB 3.0 Gehäuse (15,- €), das sowohl die SSD als auch die HDD aufnehmen kann.

 

Der Umbau

Die HDD clonen

  1. Die neue SSD in das externe Gehäuse einbauen und an den Mac anschließen
  2. Die SSD nun als „Mac OS Extended Journaled„ mittels des Festplattendienstprogramms formatieren
  3. Mit SupeDuper! eine 1:1 bootfähige Kopie der eingebauten HDD auf der SSD erstellen (bei 300GB dauert das ca. 4 Stunden)

Einbau

Ich habe für mich den Weg genommen, die nun präparierte SSD schlicht gegen meine verbaute HDD auszutauschen.
Die HDD habe ich abschließend in das nun freie externe Gehäuse verbaut und nutze dies als TimeMaschine-Backup Volume, bis ich mit meiner SSD irgendwann die 500GB überschreite. Dann muß ich die externe HDD natürlich tauschen.

 

Fazit

Der Umbau hat mich 401,- € gekostet (Kingston Speicher, Samsung 850 EVO, Schraubendreherset und externes Gehäuse).

Schneller als mit 16GB RAM und einer 1TB SSD geht es eigentlich nicht mehr.
Selbst mit den Anfangs genannten offenen Programmen, braucht mein Macbook (2012) aus dem Standby 2 Sekunden und aus dem kompletten „Aus-Modus“ 14 Sekunden bis es nebst aller Programme oben ist.

Ich bin mehr als begeistert. 🙂

Oracle DB 12.x und das C##-User-Problem

Ich habe zu Testzwecken eine Oracle DB 12.1.0.2.0 auf meinem MACBook in einer VM installiert, weil ich für einen Kunden etwas testen wollte.

Neben der mehr als suboptimalen Grundinstallation via GUI, wollte ich dann über den EM (Oracle Enterprise Manager) Benutzer für meine Tests anlegen.

Tja, da staunt der Fachmann und wundert sich der Laie: die Benutzer, die man über den EM anlegen kann, müssen alle mit mit einem „C##“ im Usernamen anfangen, sonst kann man die nicht anlegen. 🙁

Beim Versuch den User Test, also ohne das C## im Usernamen vorangestellt, anzulegen, meldete Oracle zurück:

Selbst im Test mag ich nicht, daß ich die Namen meiner Benutzer, in auch welchem Format auch immer, nach der Meinung des Herstellers benennen muß.

Also kam der EM erst mal nicht weiter in Frage. Ich habe bis jetzt noch nicht rausgefunden, wie ich dem dieses Verhalten abgewöhnen kann.

Aber, es ist ja Oracle und nach einer kurzen Suche durch die Scripte auf der VM wurde ich fündig. 🙂

Soso, ihr prüft also beim Anlegen von Benutzern ab, ob die Variable „_ORACLE_SCRIPT“ in der Session gesetzt ist ?

Na dann fix eine sqlplus-Session als sysdba aufgemacht und folgendes probiert:

Und siehe da, ich konnte den Benutzer auch ohne das führende „C##“ anlegen.

Falls also mal wer auf ein ähnliches Problem stößt:
Einfach eine SQLPlus oder SQLDeveloper als Sysdba aufmachen, _ORACLE_SCRIPT auf true setzen und schon darf man auch als sysdba wieder alles wie gewohnt 🙂

SQLDeveloper auf dem MAC

Normalerweise läuft mein MAC ja ohne Probleme und durch den Einbau einer 1TB SSD ist er eigentlich von der Geschwindigkeit her durch Nichts mehr zu toppen.

Dachte ich 🙁

Letzte Woche hatte ich eine neue Version des Oracle SQLDevelopers installiert und das Ding natürlich auch versucht zu starten.
OK, es blinkte im Dock, zeigte also an das es startete, aber danach passierte erst mal nichts mehr.
Trotz dreimal klicken, zeigte es immer nur „ich starte gerade die Applikation“ an.
Da ich keinen Zeitdruck hatte dachte ich mir „OK, suchst Du mal die Tage den Fehler“.

Als ich meinen MAC dann nur mit Batterie beim Kunden angeschaltet hatte, wunderte es mich, daß der Akkuverbrauch enorm hoch war.

Dazu kam dann noch, daß meine Festplatte auf einmal 800GB belegten Speicherplatz einzeigte. WTF ?

Die suche nach dem Akkuverbrauch brachte recht schnell 3 laufende bash-Shells mit jeweils 99% CPU Usage zu Tage.
Nur woher kam das Zeug und warum war meine Platte fast voll ?

Meine erste Vermutung, daß irgendeines von meinen 30 Terminals (ssh sessions) frei drehte, war es leider nicht.
Nach dem Schließen sämtlicher Terminals (Shells) hatte ich immer noch  3 komplett frei drehende bash-shells mit 99% CPU usage 🙁

Die Vermutung lag nahe, dass es der frisch installierte und 3 mal angeklickte SQLDeveloper sein könnte.

Eine APP unter MAC OSX ist schlicht ein Verzeichnis, in dem die ganzen Binaries und Scripte drin liegen. Auf dem MAC wird dann ein Verzeichnis was mit „.app“ endet, als Application angezeigt, auch wenn es eigentlich nur ein Directory ist.

Also ging die Suche erst mal in dem SQLDeveloper.app Verzeichnis nach dem Startscript los.
Im Verzeichnis SQLDeveloper.app/Contents/MacOS wurde recht schnell der Übeltäter erwischt: sqldeveloper.sh

Was macht nun das Startscript ?

Sieht erst mal nicht sooo verdächtig aus, aber es ruft eine neue bash auf.

Und beim Aufruf in der Concolse sagte es auch brav, daß es nun nach /tmp loggen würde.

Also einmal in /tmp nachgeschaut und was finde ich da ?
380GB Logfiles vom SQLDeveloper 🙁
Kein Wunder das meine SSD fast voll war.

Ein Blick in die Logfiles brachte dann etwas wundersames zu Tage.
Da flogen mächtig viele Exceptions, daß die passende JAVA Version nicht gefunden werden konnte

Was war passiert ?
Die suboptimale Umsetzung von Startscript und Programm führte dazu, daß der SQLDeveloper in einer Endlosschleife ging.
Das Startscript startete den, die weiteren Scripte versuchten den SQLDeveloper zu laden, der auch brav loggte „mir fehlt die passende JAVA Version“ und sich beendete, was die Startscripte zum Anlass nahmen, erneut zu versuchen das Teil zu starten.

Klassischer Deadlock in einer Endlosschleife.

Die neueste Version des SQLDevelopers 4.1.3 hat diesen Effekt nicht mehr.

Falls jemand also mal auf CPU-belastende Prozesse in Verbindung mit dem Vollschreiben der Festplatte stößt: sucht unter /tmp und killed die bash-Prozesse.