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 Fummelei mit dem Shell-Link.


Dieser Beitrag ist ursprünglich auf Meckereien & Co. erschienen.

Werbeanzeigen