[gelöst] bash: file descriptor *nicht* vererben

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
MartinV
Beiträge: 788
Registriert: 31.07.2015 19:38:52
Wohnort: Hyperion
Kontaktdaten:

[gelöst] bash: file descriptor *nicht* vererben

Beitrag von MartinV » 14.05.2018 16:42:42

Ich habe ein Wrapper-Script, das eine Reihe von Filedeskriptoren öffnet und beschreibt oder liest: &3 &4 &6 und &7.

Nun habe ich bemerkt, daß ich Probleme bekomme, wenn mein Script andere Scripte (oder eine andere Instanz von sich selbst) aufruft. bash vererbt die Filedescriptoren an aufgerufene Scripte. Wenn diese ihrerseits die gleichen Filedescriptoren öffnen, beschreiben und schließen, gibt es Chaos.

Kann ich bash anweisen, Filedescriptoren *nicht* weiterzureichen? Bei "help set" habe ich nichts gefunden.
Zuletzt geändert von MartinV am 14.05.2018 22:40:51, insgesamt 1-mal geändert.
Die Vernunft kann einem schon leidtun. Sie verliert eigentlich immer.

breakthewall
Beiträge: 507
Registriert: 30.12.2016 23:48:51

Re: bash: file descriptor *nicht* vererben

Beitrag von breakthewall » 14.05.2018 17:38:16

Das ist generell nicht möglich. Da müsstest schon beispielsweise ein C-Programm schreiben, um dieses Verhalten unmittelbar zu ändern. Nur warum musst überhaupt soviele File-Descriptors offen halten? Das ist nicht unbedingt typisch und könnte ggf. auch anders gelöst werden. Zumindest kannst über die Bash hunderte von File-Descriptors nutzen, womit eigentlich genug Spielraum haben solltest. Andererseits kannst dein Shellscript auch mal posten.

tobo
Beiträge: 1964
Registriert: 10.12.2008 10:51:41

Re: bash: file descriptor *nicht* vererben

Beitrag von tobo » 14.05.2018 18:02:57

MartinV hat geschrieben: ↑ zum Beitrag ↑
14.05.2018 16:42:42
Kann ich bash anweisen, Filedescriptoren *nicht* weiterzureichen?
Nein, das wird vererbt. Du kannst aber im aufgerufenen Skript die FDs gefahrlos entfernen, ohne dass es Konsequenzen für das aufrufende Skript hat. Liste über /proc/$$/fd oder bash-spezifisch /proc/${BASHPID}/fd.

Benutzeravatar
MartinV
Beiträge: 788
Registriert: 31.07.2015 19:38:52
Wohnort: Hyperion
Kontaktdaten:

Re: bash: file descriptor *nicht* vererben

Beitrag von MartinV » 14.05.2018 18:06:11

breakthewall hat geschrieben: ↑ zum Beitrag ↑
14.05.2018 17:38:16
Andererseits kannst dein Shellscript auch mal posten
Das Script hat ein paar tausend Zeilen :twisted: . Du findest es hier: https://github.com/mviereck/x11docker
breakthewall hat geschrieben: ↑ zum Beitrag ↑
14.05.2018 17:38:16
Zumindest kannst über die Bash hunderte von File-Descriptors nutzen, womit eigentlich genug Spielraum haben solltest.
Ein Problem ist, das ich nicht vorhersehen kann, welche Filedescriptoren ein aufgerufenes Programm bzw. Script möglicherweise nutzt. Mein Script ist ein Wrapper, dem ein beliebiges anderes Programm als Argument übergeben werden kann, das dann gestartet wird.

Ich habe gerade für den Fall, daß mein Script sich selbst startet, das Problem beheben können. (Eine interne Prüfung, ob ein Logfile-Descriptor schon offen ist, war falsch).

Gute Nachricht: Öffnet ein aufgerufenes Script die gleiche Filedeskriptor-Nummer, kann es sie verwenden, ohne den Filedeskriptor des Wrapper-Scriptes zu beeinflussen. Das Tochterskript kann nur nicht mehr in den Deskriptor des Wrappers hineinschreiben.
(Edit: Zeitüberschneidung, das ist das, was auch tobo schreibt.)

Das Problem hält sich also in Grenzen. Ein sauberes Tochterskript wird seine eigenen Deskriptoren öffnen, bevor es hineinschreibt. Sollte es nicht so sauber sein, beschmutzt es in diesem Fall nur Logdateien und Terminalausgabe des Wrappers, macht aber nichts kaputt.

Würde ich wichtigere Daten umleiten, hätte ich allerdings ein echtes Problem.

Edit: Eine Alternative sind named pipes, die ich mit mkfifo erzeugen kann. Eine sichere Lösung bietet das aber auch nicht, da jedes Programm dort hineinschreiben könnte. Aber zumindest würde es vermutlich nicht in der Erbschaft auftauchen.
Zuletzt geändert von MartinV am 15.05.2018 09:31:43, insgesamt 1-mal geändert.
Die Vernunft kann einem schon leidtun. Sie verliert eigentlich immer.

Benutzeravatar
MartinV
Beiträge: 788
Registriert: 31.07.2015 19:38:52
Wohnort: Hyperion
Kontaktdaten:

Re: bash: file descriptor *nicht* vererben

Beitrag von MartinV » 14.05.2018 22:40:20

tobo hat geschrieben: ↑ zum Beitrag ↑
14.05.2018 18:02:57
Du kannst aber im aufgerufenen Skript die FDs gefahrlos entfernen, ohne dass es Konsequenzen für das aufrufende Skript hat. Liste über /proc/$$/fd oder bash-spezifisch /proc/${BASHPID}/fd.
Danke, tobo! Das hat mich letzlich zu einer Lösung geführt.
Ich erzeuge im Wrapper-Skript ein weiteres Skript, das erst die Filedeskriptoren schließt, bevor es das gewünschte Programm startet.

Direktes Löschen mit rm war nicht möglich mangels Schreibrechten in /proc/$$. Stattdessen regulär schließen mit "exec >&3- >&4- >&6- >&7-".

So bleiben dem Wrapper die Filedeskriptoren erhalten, das letztendlich gestartete Programm bekommt sie aber nicht zu sehen.

Kurzform als Einzeiler: exec in einer Subshell. Dadurch wird nur die Subshell ersetzt, nicht das Hauptskript:

Code: Alles auswählen

(exec >&3- >&4- >&6- >&7- programm)
Die Vernunft kann einem schon leidtun. Sie verliert eigentlich immer.

Antworten