Bad fd number

Ein Nerd-Beitrag, der hoffentlich weiter helfen könnte.

Das Bad fd number Problem ist aufgetaucht, als ich mein Python-basiertes Programm auf Ubuntu testen wollte. Im Code werden einige externe Befehle aufgerufen, mit Hilfe von os.system(command), wo command ein String ist. Auf Scientific Linux: Kein Problem. Das hatte mein Vorgänger selber so implementiert. Auf Ubuntu ist das Programm abgestürzt, mit der Meldung:

sh: 1: Syntax error: Bad fd number

Ich habe danach gegoogelt und herausgefunden, dass das Problem aus einem Shell-Link kam. Auf Ubuntu verlinkt /bin/sh zu dash, und nicht zu bash wie auf anderen Linux-Betriebssystemen. Die Lösung schlug vor, stattdessen /bin/sh zu bash zu verlinken:

sudo mv /bin/sh /bin/sh.orig

sudo ln -s /bin/bash /bin/sh

Ich habe es auf meinem Testrechner ausprobiert und kein Problem festgestellt. Seit über einem Monat steht diese Lösung auf der internen Webseite unserer Gruppe. Keiner hat etwas dagegen geäußert. Letzte Woche habe ich die Installationsanleitung für Ubuntu als Entwurf auf der Projekt-Webseite kopiert und Uschi gebeten, sich den Inhalt genau anzuschauen, bevor er die Webseite frei gibt. Die Webseite hat er veröffentlicht.

Diese Woche waren wir endlich so weit und mein Programm ist veröffentlicht worden. Rundmails zur Ankündigung geschickt, Anzahl der Downloads begeistert verfolgt, Rückmeldungen mit Wünschen für neue Funktionen oder (sehr wenig) Installationsproblemen bekommen. Gestern fragte mich Uschi auf einmal ganz überrascht, was die Änderung vom Shell-Link auf Ubuntu sollte. Es wäre nicht OK, dadurch könnte man das komplette System verschrotten, eine andere Lösung müsste her. Ich war irritiert, dass er das erst jetzt merkt.

Ich hatte vermutet, dass das Problem aus dem externen Befehl in command stammt und dachte, ich müsste mit dem Autor des Skriptes Kontakt nehmen, um nach einer Lösung zu fragen. Bestimmt hätten schon viele Ubuntu-Nutzer sein Skript benutzt und das gleiche Problem gehabt. Vorher wollte ich trotzdem sicher sein. Ich habe den ursprünglichen Shell-Link zu dash wieder erstellt. Ich habe das im Programm erzeugte command direkt vor seiner Ausführung und vor dem Programmabsturz ausdrucken lassen. Der Code sah so aus:

print(command)

os.system(command)

und im Terminal hatte ich das command ausgedruckt, gefolgt von der Bad fd number Meldung und den ganzen Tracebacks. Genau das gleiche auf Scientific Linux ging ohne Problem.

Zurück auf Ubuntu, habe ich mit copy/paste command im Terminal selber ausgeführt. Und Überraschung, auf einmal ging’s. Merkwürdig. Die ganze Zeit hatte ich das externe Skript für die Ursache des Problemes gehalten. Jetzt kam der Verdacht, dass os.system(command) auf Ubuntu anders als auf Scientific Linux funktioniert. Oder genauer ausgedrückt: os.system() ruft anscheinend /bin/sh, und /bin/sh -> bash auf allen Linux-Systemen, außer auf Ubuntu, wo das Ziel des Linkes dash ist. Daher die Fehlermeldung.

Ein Lösungsansatz war auf einmal klar. Alle externe Befehle mit os.system() sollten mit subprocess.Popen() ausgeführt werden. Und genau das hat funktioniert. Jetzt brauche ich nicht mehr die Fummelerei mit dem Shell-Link.

Anstrengende Woche

Sie hatte hart angefangen. Ich bin den Anweisungen von meinen Chefs gefolgt und habe an meinem Projekt weiter gearbeitet, als ob nichts wäre. Meine Webseite ist fertig. Trotz Verzweiflungen wegen TYPO3, wobei, was mich vor allem wirklich nervt ist, dass man bei uns nach jedem Klick ewig warten muss, bis Seiten geladen werden. Ich hoffe jetzt, dass Uschi sagt, alles ist in Ordnung, und dann kann das Programm endlich veröffentlicht werden.

Am Dienstag ging’s mir nicht so gut. Ich habe den Tag mit einer Migräne abgeschlossen. Ich bin abends nicht zum Sport gegangen, sondern früh direkt nach Hause mit der Tram gefahren. Martin ist aus seiner Dienstreise spät zurück gekommen, und wir haben uns erst am Mittwoch wieder gesehen.

Mein Arbeitgeber hat nicht gewartet, um meinem Vorgänger einen bösen Brief zu schicken. Seine Reaktion war schnell, am Mittwoch hatte er schon alles runter genommen. Das hat Uschi erst heute gemerkt. Er hat uns eine schadenfrohe  Email geschickt, mit einem Screenshot von einem 404-Fehler und spottischen Bemerkungen. Typisch von ihm. Er hat sich aber noch nicht um die Korrektur meiner Webseite gekümmert.

Ich habe mich heute Abend in den Hintern getreten, um zum Fitness-Studio zu gehen. Es war nötig. Stress habe ich trotzdem immer noch. Morgen ist es geplant, dass ich mittags mit Martin und seinem Vater essen gehe. Ich kenne ihn noch nicht. Ich bin ganz schön aufgeregt.

Wie man ein Vorstellungsgespräch zum Scheitern bringt

Es gibt bestimmt viele Möglichkeiten. Diese kannte ich noch nicht. Uschi hatte es uns erzählt, aber ich hatte noch nicht darüber geschrieben.

Wir hatten vor einiger Zeit für mehrere Stellen in der Arbeitsgruppe eine Reihe von Kandidaten zu Besuch. Dabei hatte mir eine Kandidatin für die zweite Stelle einen guten Eindruck gemacht. Sie wirkte kompetent, hatte einen verständlichen Vortrag geliefert, was bei mir als Laie immer gut ankommt, und die Fragen danach gut behandelt. Beim Gruppengespräch fand ich sie sympatisch. Am Ende des Tages hatten wir mit Uschi über alle Kandidaten diskutiert. Er konnte sich nicht richtig entscheiden, mit einer kleinen Präferenz für diese Kandidatin. Ich dachte, sie hätte es geschafft.

Einige Tage später kam Uschi zu uns und meinte, er hätte sich für eine andere Person entschieden. Der Grund gegen die Kandidatin lag in ihrer Reisenabrechnung. Sie kam aus einem deutschsprachigen Nachbarland und war schon ein paar Tage vorher hierher geflogen. Mit ihrem Freund. Sie wollte die Gelegenheit nutzen, um mit ihm die Stadt zu besuchen. Beim Gruppengespräch hatten wir unter anderem über Sehenswürdigkeiten diskutiert. Ihr Hotel lag nicht weit weg vom Institut. Am Tag des Vorstellungsgespräches war sie aber mit Taxi gekommen und weggefahren, und hatte uns die Abrechnung dafür geschickt. Obwohl sie sehr gut Deutsch kann und mit öffentlichen Verkehrsmitteln hätte fahren können. Obwohl die Vorträge vormittags um 10:00 angefangen hatten, und sie locker Zeit gehabt hätte, um mit Bus und Bahn zu kommen. Das hat Uschi gar nicht gefallen. Er fand es unverschämt. Wir sind im öffentlichen Dienst, wir schwimmen nicht im Geld. Er meinte, sie würde uns zu Narren halten, wenn wir sie einstellen. Die Reisekosten haben wir bezahlt, und sie hat eine Absage bekommen. So einfach kann es also gehen.

Großen Mist gebaut

Seit Wochen arbeite ich daran, das von mir weiterentwickelte Programm zu prüfen und auf verschiedenen Betriebssystemen zu testen. Ich bin endlich so weit, dass es veröffentlicht werden kann. Die Webseite habe ich intern neu bearbeitet, ich warte darauf, dass Uschi die Freischaltung des Inhaltes erlaubt. Dann lade ich diese Woche die neue tar-Datei zum herunterladen hoch und schreibe eine Email an unserer internationalen Fach-Mailingliste. So war der Plan.

Groß war also meine Überraschung, als ich heute Morgen um 09:00 zur Arbeit ankam und meine Emails las. In der Mailingliste lag eine Nachricht von meinem Vorgänger, um 01:32 geschickt, wo er das Programm vorstellt, zusammen mit einem Download-Link auf seiner privaten Webseite. Das Programm dort ist ziemlich genau das, woran ich seit Juli arbeite, mit der Ausnahme, das der Inhalt eines Tabs woanders liegt und der Name des Programmes geändert wurde. Die Diffs zeigen, dass es sich kaum von der Version unterscheidet, die er uns hier gelassen hat, bevor ich angefangen habe. Ich habe gedacht, wenn es eine Reaktion geben soll, wird sie von meinen Chefs kommen. Wir haben alle die Mailingliste abonniert. Ich wollte Uschi nach seiner Meinung fragen, aber er war gerade nicht in seinem Büro. Winfried sagte, sie hätten schon darüber diskutiert. Die Rechtsabteilung meines Arbeitgebers wird sich damit beschäftigen. Und wir sollten nichts dem Rest der Arbeitsgruppe mitteilen. Winfried hat dabei meine Kollegin ausdrücklich namentlich erwähnt, die bekanntlich mit meinem Vorgänger sehr eng befreundet ist. Er will nicht, dass sie ihn über unsere nächsten Aktionen informiert.

Einen ähnlichen Fall hatten wir schon in meiner früheren Uni. Ein ehemaliger Mitarbeiter, der der Meinung war, dass das Ergebnis seiner Arbeit dort vollständig sein Eigentum war und seine Unterlagen bei seinem Austritt nicht rausrücken wollte. Hier ist es anders, das Programm war noch da, als ich angekommen bin, und ich konnte sofort damit arbeiten. Trotzdem gehört das Programm dem Arbeitgeber, und es hat keine Abstimmung gegeben, dass mein Vorgänger es auf seiner privaten Webseite frei gibt. Ich finde sein Vorgehen sehr merkwürdig. Er hat die Arbeitsgruppe schon seit Juni verlassen. Er wollte nicht mehr mitmachen, obwohl sein Vertrag nicht abgeschlossen war. Er wollte für das Lehramt studieren und nichts mehr mit Forschung zu tun haben. Das war seine Aussage, und das haben mir alle meine anderen Kollegen bestätigt. Warum macht er auf einmal so was, was bringt es ihm, und ist es ein Zufall, dass es ausgerechnet jetzt statt finden soll?

Was er sich davon erhofft weiß ich nicht. Für eine Karriere als Lehrer sehe ich nicht, warum es relevant sein sollte. Die gleiche Frage haben sich auch Uschi und mein IT-Kollege gestellt, ohne eine Antwort zu finden. Eine Veröffentlichung über die erste Version hat er schon als erster Autor geschrieben. Unsere Nutzer kennen ihn gut, er hat mehrmals Vorträge darüber gehalten. Er ist eindeutig als Autor des Programmes bekannt. Ich hätte gedacht, es müsste doch als Anerkennung reichen. Warum jetzt, wenn er seit über einem halben Jahr nicht mehr bei uns ist? Es ist so zeitnah zu unserem geplanten Release, dass ich nicht an einem Zufall glauben kann. Und nur meine Kollegen wissen Bescheid, da wir regelmäßig im Gruppenmeeting darüber diskutiert haben. Gut, einige Nutzer waren auch informiert. Die Email um 01:32 ist kein gutes Zeichen. Man kann ziemlich viel Blödsinn um die Uhrzeit machen, wenn man deprimiert ist. Ich weiß. Aber das hier wird rechtliche Konsequenzen haben. Und ich finde es schade, weil er mir doch einen sehr netten Eindruck gemacht hatte. Andererseits habe ich ihn seit meinem Vorstellungsgespräch nie wieder gesehen, da er so früh wie möglich Berlin verlassen wollte. Ich kenne ihn kaum.

Samstagabend

Zu Hause. Ich liege im Bett, alleine. Sein Kopfkissen habe ich neben die Wand gestellt. Meine Katze freut sich, dass ich nach zwei Nächten bei ihm wieder hier schlafe, und mich nur für sich hat. Ganz alleine war sie nicht, ich bin jeden Tag kurz gekommen, um sie zu versorgen und zu schmusen. Sie hat sich jetzt auf meinem Arm hingelegt und schnurrt vor sich hin.

Ich habe ihn heute Morgen zum Flughafen begleitet. Dienstreise. Nach Grenoble. Da er dort vor seinem jetzigen Job fast zehn Jahren gelebt hat, besucht er noch Freunden am Wochenende. Er kommt erst am Dienstagabend zurück. Seitdem er die Reise vor einigen Wochen erwähnt hat, lässt es mich nicht in Ruhe. Ich war mir nicht ganz sicher, aber jetzt weiß ich es: Er hat genau mit der Arbeitsgruppe zu tun, in der David auch arbeitet. David hat mich übrigens letzte Woche wieder kontaktiert. Er hatte sich mein Programm heruntergeladen und brauchte ein bisschen Hilfe. Ich habe es Martin danach kurz erzählt und ihn gefragt, ob er ihn kennt. Sein Gesicht wurde finster, als er ja sagte. Ich habe deswegen das Thema nicht verfolgt und ihm nicht gesagt, dass er ein Ex-Freund von mir ist. Jetzt habe ich Angst, dass er das von David selbst erfährt. Schön wäre es definitiv nicht. Obwohl die Geschichte fünfzehn Jahre alt ist.

Ich habe den Nachmittag in der Stadt verbracht und Shopping gemacht. So viel, dass mein Ischias wieder schmerzt. Neue Unterwäsche wollte ich mir besorgen. Hoffentlich gefallen sie ihm. Ich habe mich danach bei Biba umgeschaut. Sehr schöne Kleider, aber was mich nervt ist, dass die Verkäuferinnen immer wieder versuchen, mir weitere Teile zu verkaufen, nachdem ich meine Auswahl schon getroffen habe und an der Kasse stehe, und mir immer wieder erzählen, ich sollte mir doch eine Kundenkarte besorgen. Es wird langsam lästig. Ich habe mir eine von den reduzierten Hosen anprobiert. Größe 40. Vor drei Monaten hatte ich gestaunt, dass ich drin passe. Heute war selbst die mir zu groß. 38 war nicht mehr vorhanden. Ich bin nur mit einer Jacke raus gegangen. Anschließend habe ich mir bei IKEA Kleinigkeiten besorgt.

Als ich auf dem Weg nach Hause war, hat mich Winfried angerufen. Wegen der Arbeit. Einige Nutzer wollten eine bestimmte Version meines Programmes benutzen und er kannte den Befehl nicht mehr. Obwohl ich es auf unserer internen Homepage schon länger aufgeschrieben habe. Ich durfte die Nutzer selber an der Beamline anrufen, um ihnen zu erklären, wie das Programm läuft. Ich war nicht begeistert. Schließlich ist es Wochenende, und Winfried hätte es selber machen können.

Bloody Valentine

Nachträglich. Der Titel hört sich wie ein Horrorfilm an.

Ich habe die Nacht bei Martin verbracht. Wir waren am Abend im Kino gewesen. Diesmal nicht Berlinade, sondern reguläres Programm. 12 years a slave, der spät in einem kleinen Kino in Neukölln lief. Auf dem Rückweg zur U-Bahn habe ich Geld am Automat geholt. Martin auch. Eine junge Frau stand am Schalter neben uns, und zwei Obdachlosen schliefen in einer Ecke. Es war schön warm drin. Als wir raus gehen wollten, fragte die Frau Martin, ob er ihr helfen könnte, eine Überweisung durchzuführen. Ich war sehr skeptisch. Entweder ist die Frau extrem naiv und vertraut jedem, oder sie ködert rum und will irgendwas unternehmen, dachte ich. Ich habe seinen Rucksack die ganze Zeit nicht aus den Augen gelassen. Es sah tatsächlich so aus, als ob sie nur Hilfe wollte. Aber irgendwie hat sie nichts von dem verstanden, was Martin ihr erzählt hat. Wir haben gefühlt fast zehn Minuten bei ihr gestanden. Nachdem er ihr zum dritten Mal erklärt hat, was eine IBAN ist und sie ihn mit kleiner Stimme fragte, welche Nummer sie denn eintippen sollte (seine? Er hielt ja seinen ausgedruckten Kontostand zur Erklärung in der Hand…), habe ich die Geduld verloren und gesagt, sie sollte sich doch am nächsten Tag am Schalter bei den Angestellten der Bank erkundigen, die ja dafür ausgebildet und bezahlt sind. Ich dachte, wie sie sich anstellt, macht sie sonst noch ein Fehler und beschuldigt uns dafür. Wir haben die U-Bahn verpasst und sind fast um 01:00 bei ihm angekommen. Wir waren müde und haben nur geschlafen.

Beim Aufwachen habe ich mich bei Martin eingekuschelt. Aufstehen wollte ich nicht. Ich habe es irgendwann geschafft und bin als erste duschen gegangen. Dabei habe ich plötzlich gemerkt, dass ich meine Periode habe. Wie ein offener Hahn ist Blut auf einmal herunter geströmt. Zum Glück habe ich nichts versaut (ich habe später nachgeprüft) und es war noch dunkel im Schlafzimmer. Ich habe meine Kleider und meine Tasche geholt und bin schnell mit zusammen gepressten Beinen zur Dusche gegangen. Er hat davon nichts gemerkt. So schlimm habe ich es seit langer Zeit nicht erlebt. Kein Wunder, dass ich am Tag davor solche starke Schmerze hatte. Ich habe so viel Blut verloren, dass ich mittags noch eine Box Tampons kaufen gehen musste; die drei, die ich immer in der Tasche parat hatte, waren für den Vormittag nicht genug. Ich habe mich gefragt, warum wir in den Toiletten bei der Arbeit keinen Automat dafür haben.

Ich habe mich abends noch zum Sport geschleppt und meinen Trainingsplan durchgeführt. Ich hatte mich mit Martin später in der Stadt verabredet. Zu Hause geduscht, parfümiert, und sogar mit Lippenstift leicht geschminkt. Enges Kleid mit Pumps. Die hatte ich seit unserem ersten Kuss gar nicht mehr getragen. Nein, Valentinstag ist mir egal. Es ist mir auch egal, ob er noch weiß, was ich damals getragen hatte. Ich wollte mich einfach nur für ihn wieder schön machen. Ein Volltreffer, seinem Blick nach zu beurteilen. Wir hatten nichts Besonderes geplant und sind ein bisschen spazieren gegangen. Wir haben uns ein Pizza geteilt. Wir wollten noch zur Cocktail-Bar am Anhalter Bahnhof gehen, aber die Türsteher haben uns gewarnt, es wäre schon voll, es wäre ja Valentinstag. Wir haben es nicht probiert und sind zu einem hispanischem Lokal gegangen, bevor wir zu ihm mit Taxi gefahren sind (der Taxifahrer hatte wunderschöne Origami-Stücke für seine Kinder gemacht und mir einen davon geschenkt). Wir sind ins Bett gegangen und haben gekuschelt. Und wieder keinen Sex gehabt. Blöde Tage.

Parallelprogrammierung

Die Meldung kommt ein bisschen spät, aber wer sich für dieses Thema interessiert, kann sich noch für den kostenlosen online Kurs beim openHPI anmelden. Die erste Woche ist fast abgelaufen, der Termin für die erste Hausaufgabe ist heute Abend. Man sollte für den Kurs mit einer Programmiersprache vertraut sein, was vor allem bedeutet, wissen, wie man programmiert, und Englisch beherrschen, da der Kurs diesmal nicht auf Deutsch statt findet.

Ich hätte es selbst fast vergessen, obwohl ich schon seit einigen Wochen darauf warte. Nachdem Martin mich gestern Abend von der Berlinade zurück nach Hause gefahren hat, habe ich mir die erste Hälfte der Vorlesungen letzter Woche angehört. Wie ich nach meinem ersten Kurs bei ihnen über Datenmanagement mit SQL erwartet hatte, ist der Stoff der ersten Woche wirklich nicht wild, das kann man schnell erledigen. Es geht darum, Vokabel fest zu legen und die Motivation hinter Parallelprogrammierung zu lernen. Das (empirisch festgelegte) mooresche Gesetz kannte ich schon, dazu kommen die ganzen physikalischen Beschränkungen für die immer effizientere Durchführung von Programmen, wie die Leistung- oder Speicherbarrieren (von mir frei übersetzt, keine Ahnung, ob es auf Deutsch wirklich so heißt).

Ich bin gespannt auf die kommenden Wochen.

Kernel panic

Es fing damit an, dass Uschi mich vorgestern gefragt hatte, openVPN auf meinem Rechner zu installieren, damit ich von meinem Rechner aus mein Programm auf seinem Mac laufen lassen kann. Ich hatte bis gestern noch keine Zeit gehabt, als er mich fragte, ob die Installation erfolgreich war. Gegen 18:00 habe ich also angefangen, mich darum zu kümmern, und habe festgestellt, dass seit mein Vorgänger die Arbeitsgruppe verlassen hat, kein Update gemacht wurde. Kann ich gleich machen, dachte ich. Als root mit su - einloggen, dann yum -y update. Es waren 144 davon in der Liste. Eine Meldung zum Entfernen und zur Neuinstallierung von Kernel wurde auch angegeben. Wenn yum das vorschlägt, kann es wohl nicht schaden, dachte ich mir naiv. Danach habe ich openVPN installiert und es irgendwie nach gegoogelten Anleitungen konfiguriert. Es war schon fast 20:00 und ich war mit Martin verabredet, daher habe ich mich ausgeloggt und Feierabend gemacht.

Heute Morgen angekommen, eingeloggt… Geht nicht. Ich dachte zuerst, ich hätte mich beim Eintippen vom Passwort vertippt, aber nach dem vierten Mal kann es nicht sein. Capslock war aus. Auf meinem Testrechner habe ich mit dem gleichen Passwort kein Problem gehabt. Und mit ssh konnte ich mich auf meinem Rechner einloggen. Merkwürdig. Vielleicht sollte ich den Rechner nach den vielen Updates von gestern neu starten? Tja, beim Hochfahren kam die Meldung:

Kernel panic - not syncing: Attempted to kill init!
Pid: 1, comm: init Not tainted 2.6.32-431.1.2.el6.i686 #1
Call Trace:
[] ? panic+0x6e/0x122
[] ? do_exit+0x741/0x750
[] ? do_group_exit+0x3c/0xa0
[] ? sys_exit_group+0x11/0x20
[] ? sysenter_do_call+0x12/0x28

Nicht nur der Kernel hat Panik bekommen. Mein IT-Kollege war schon um 08:30 mit anderen Aufgaben überlastet und hatte keine Zeit. Wie üblich.

Nach mehreren gezwungegen Neustarten habe ich gemerkt, dass ich mit ESC zum Boot-Menü gehen konnte, und dort waren drei Versionen von Scientific Linux vorhanden. Die erste führte zum Kernel panic. Mit der zweiten konnte ich meine Login-Daten angeben, aber nach einem scheinbaren Start meiner Session kam das Login-Fenster wieder. Mit der dritten und ältesten Version bekam ich nur einen schwarzen Bildschirm mit einem blinkenden Kursor. Nur mit der zweiten konnte ich mich von meinem Testrechner aus durch ssh einloggen.

Mit yum history undo xxx dachte ich, die Lösung gefunden zu haben. Aber jetzt sieht es so aus:

Kernel panic - not syncing: VFS: Unable to mount fs on unknown-block(0,0)

Ich kann mich nun gar nicht mehr ins Rechner anmelden.

Ein verliebter Knabe

Heute Nacht war ich anscheinend die Freundin von meinem Kollegen Winfried. Wir wohnten zusammen in einer Wohnung am Erdgeschoss eines kleinen Hauses.

Es war früh morgens. Winfrieds Sohn hatte sich für die Schule vorbereitet und ich hatte ihn zur Haltestelle vor dem Haus begleitet, damit er seine Tram nicht verpasst. Wir standen vorne, der Schild der Haltestelle war hinter uns. An die Schule dachte der Junge kaum, sondern nur an seine Verliebte, ein Mädchen in seiner Klasse. Er war mit ihr verabredet und tauschte die ganze Zeit SMS mit ihr. Ich hatte für die Beiden belegte Brötchen mit Frischkäse und Schnittlauch vorbereitet und war gerade dabei, sie in seinen Schulranzen zu packen. In dem Moment ist die Tram weit hinter uns angekommen, hat kurz gehalten und ist wieder weg gefahren. Ich war empört, dass sie nicht vor dem Schild gehalten hat und habe mich schuldig gefühlt, dass der Junge wegen mir die Tram verpasst hat.