Inter-Prozess-Kommunikation ohne FIFOs
Innerhalb eines BASH-Skript haben, können wir mehrere Prozesse im hintergrund, die miteinander kommunizieren über named pipes, FIFOs eingetragen in das Dateisystem. Ein Beispiel HIERFÜR könnte sein:
#!/bin/bash
mkfifo FIFO
# BG process 1
while :; do echo x; done & >FIFO
# BG process 2
while :; do read; done & <FIFO
exit
Frage ich mich, ob es möglich ist, das gleiche zu tun Informationsaustausches zwischen hintergrund-Prozesse, die von einem Skript ohne Verwendung einer FIFO-Dateisystem auf, vielleicht mit irgendeiner Art von Datei-Deskriptor Umleitung.
Sie können
Ich würde es vorziehen, nicht zu haben, um zu verwalten, das Dateisystem überhaupt. Auch für ein schnelles erstellen/löschen von Dateien oder FIFOs, das Dateisystem Interaktion sinkt die Leistung.
Leider bourne-shell nicht sehr flexible Handhabung dieser Dinge. IPC ist auf jeden Fall möglich, ohne FIFOs obwohl, da Sie noch ziemlich frisch: die zugrunde liegenden Anrufe socketpair/Rohr.
Das klingt interessant. Könnten Sie mir eine doc-Referenz oder einen sehr-kurzen Beispiel?
Sorry, Müll Wortlaut dort. Was ich damit sagen wollte: FIFOs sind die jüngsten, so dass IPC ist klar ohne Sie möglich. Wenn Sie nicht mit FIFOs, die zugrunde liegenden Anrufe werden auf socketpair (oder Rohr). Bash hat eine Menge lustige Einschränkungen der Datei-Deskriptoren, so ist es meist besser, den moment diese Probleme auftauchen, gerade zu gehen, um so etwas wie python oder (meine Vorliebe) einen C-wrapper, der die Anrufe, die Sie erreichen wollen, direkt.
mktemp
zu kommen mit einem einzigartigen NamenIch würde es vorziehen, nicht zu haben, um zu verwalten, das Dateisystem überhaupt. Auch für ein schnelles erstellen/löschen von Dateien oder FIFOs, das Dateisystem Interaktion sinkt die Leistung.
Leider bourne-shell nicht sehr flexible Handhabung dieser Dinge. IPC ist auf jeden Fall möglich, ohne FIFOs obwohl, da Sie noch ziemlich frisch: die zugrunde liegenden Anrufe socketpair/Rohr.
Das klingt interessant. Könnten Sie mir eine doc-Referenz oder einen sehr-kurzen Beispiel?
Sorry, Müll Wortlaut dort. Was ich damit sagen wollte: FIFOs sind die jüngsten, so dass IPC ist klar ohne Sie möglich. Wenn Sie nicht mit FIFOs, die zugrunde liegenden Anrufe werden auf socketpair (oder Rohr). Bash hat eine Menge lustige Einschränkungen der Datei-Deskriptoren, so ist es meist besser, den moment diese Probleme auftauchen, gerade zu gehen, um so etwas wie python oder (meine Vorliebe) einen C-wrapper, der die Anrufe, die Sie erreichen wollen, direkt.
InformationsquelleAutor davide | 2012-06-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist ein Beispiel, das läuft in zwei Teilprozessen implementiert, die als Funktionen von der gleichen shell-Skript... Ein Unterprozess erzeugt die zahlen 1...5 (schläft in zwischen-Drucke), die zweite liest man von einem festen filedescriptors (5, um die STDOUT von der ersten FD weitergeleitet wird), multipliziert das Ergebnis mit 2 und druckt wieder. Die wichtigsten Prozess-Umleitungen von STDOUT des zweiten Prozesses zu anderen festen filedescriptors (6) und später liest, dass man in der Schleife.
Es funktioniert im Grunde das gleiche wie Sie tun würde, in C-code mit fd-Paare erzeugt, die durch das Rohr(2) - Systemaufruf. Um zu verstehen, was geschieht, führen Sie das Skript unter strace -f!
Bash-Version 4.2.24(1) unter Ubuntu/x86.
Ausgabe des Skripts:
Source code:
Prozess-Baum während der Ausführung:
InformationsquelleAutor Christian Vogel
Bash 4 hat coprocesses.
Können Sie auch anonyme named pipes aka Prozess-substitution in Bash 2, 3 oder 4.
Dann würde ich sagen, man sollte etwas anderes als die Bash. Übrigens, das Referenz-Handbuch sagt: "mit einem zwei-Wege - Rohr zwischen dem ausführen von shell-und die coprocess" [Hervorhebung von mir].
Sorry Dennis, ich war nicht klar. Ich meine, ich bin nicht sicher, ob ein zwei-Wege-Umleitung ist möglich mit Prozess-substitution. Natürlich
coproc
können, aber leider Bash beschränkt seine Verwendung, um nur eine pro Instanz.InformationsquelleAutor Dennis Williamson
Könnten Sie
nc
(akanetcat
), die ermöglicht den Anschluss von einem Skript die standard-streams an einen Netzwerk-socket. Natürlich funktioniert es auch auf localhost, so können Sie es verwenden, für die IPC zwischen den Skripts. Der bonus die Möglichkeit zu haben, die Scripte laufen auf unterschiedlichen hosts ist nicht möglich, mit FIFOs (OK, vielleicht auf NFS ist es, aber das wäre sehr umständlich zum einrichten, es sei denn, Sie haben bereits den NFS).Möglicherweise ja, aber wenn Sie wählen Sie einen beliebigen port aus dem sicheren Bereich (nicht ein ephemeral port ) es ist nicht sehr wahrscheinlich. Darüber hinaus, wenn Sie sagen
nc
zu lauschen auf einem port, welcher bereits vergeben ist, wird es sofort wieder mit einer Fehlermeldung, danach können Sie versuchen, den nächsten Hafen und so weiter. Natürlich, man müsste dann die Kommunikation der port, an dem andere app über einen anderen Kanal, wie durch eine Datei. Wahrscheinlich müssten Sie nur diese einmal auf eine bestimmte Maschine, obwohl. Beide Lösungen sollten funktionieren gut genug, um praktisch zu sein.Auch firewall-Einstellungen erschweren könnte, diese Methode der Kommunikation.
InformationsquelleAutor Michał Kosmulski
Ich möchte nur darauf hinweisen, dass hässliche hacks nicht wollen, werden so geboren.
Teil, der die Daten empfängt:
Teil, die Daten sendet:
Funktioniert auch in MSysGit ist Bash für Windows, zu meiner überraschung.
InformationsquelleAutor Camilo Martin
Haben Sie als die Verwendung der Signale? Wenn die einzige Sache, die Sie benötigen, um ein Ereignis auszulösen (ohne übergabe von Argumenten), mit töten und in die Falle funktioniert perfekt (vorsichtig sein, die Semantik jedoch, verwenden Sie SIGUSR1 zum Beispiel).
Müssen Sie möglicherweise zu überarbeiten, die Logik aber, wie im Beispiel unten:
InformationsquelleAutor Fabien Bouleau