2016-08-01 37 views
0
auf ubuntu erfolgt

genau zu sein, ich habe zwei Befehl benötigen in Shell auf Ubuntu zugleich ausgeführt werden soll, wie command_A und command_B. Und ich habe einige andere Befehle müssen nur ausgeführt werden, nachdem command_A und command_B beendet hat, benannt als command_rest. Darüber hinaus command_A und command_B laufen in separaten Terminals und wenn sie fertig sind, können sie sich schließen. Dies benötigt möglicherweise Techniken im Zusammenhang mit Signal und warten und gnome-terminal ich denke, aber ich kann keine Lösung finden., wie mehrere Befehle gleichzeitig und den Rest verarbeiten erst, nachdem alle

+0

Dies ist perfekt möglich und lassen Sie uns bitte wissen, welche Optionen Sie erforscht haben/versucht? – Inian

+0

Ich glaube, das ist, was Sie suchen [\ [Answer \]] (http://stackoverflow.com/a/10909842/5924412) – developerbh

+0

Mögliche Duplikate von [Parallele mehrere Befehle gleichzeitig im selben Terminal ausführen] (http : //stackoverflow.com/questions/10909685/run-parallel-multiple-commands-at-once-in-the-same-terminal) –

Antwort

0

Sie es so ein Fifo tun können, mit synchronisieren:

# Once in either Terminal 
mkfifo A B 

# In first Terminal 
(echo CommandA; sleep 3; echo done > A) & 

# In second Terminal 
(echo CommandB; sleep 8; echo done > B) & 

# In third Terminal 
read < A; read < B; echo Rest 

Grundsätzlich vor Rest laufen kann, muss es lesen von beiden A etwas haben und B und nichts wird ankommen es bis zu lesen CommandA ist fertig und auf A geschrieben und auch CommandB ist fertig und auf B geschrieben.

oben Das ist nur ein Beispiel, das CommandA und CommandB und Rest statt Ausführen von Befehlen widerhallt, die ich nicht habe. Sie werden tatsächlich so etwas wie dies wollen (ich habe es geändert, so dass Sie in verschiedenen Verzeichnissen in den verschiedenen Terminals sein können)

# Once in either Terminal 
mkfifo /tmp/A /tmp/B 

# In first Terminal 
(CommandA; echo done > /tmp/A) & 

# In second Terminal 
(CommandB; echo done > /tmp/B) & 

# In third Terminal 
read < /tmp/A; read < /tmp/B; commandRest 
+0

Ich schrieb dies in fifo.sh und führe es mit dem Befehl ". Fifo.sh ", und seine Ausgabe mag Folgendes: CommandA \ n CommandB \ n Rest \ n [2] - Fertig (echo CommandA; Schlaf 3; echo fertig> A) \ n [3] + Fertig (echo CommandB; Schlaf 8; echo done> B) \ n (\ n ist für eine andere Zeile) (die letzte Zeile tauchte auf, wenn ich einen anderen Befehl eintrage) Es scheint bereits funktioniert zu haben, aber ich war nur neugierig, was die Ausgabe in den letzten zwei Zeilen bedeutet. –

+0

Die anderen Zeilen sind nur so, dass ich ein funktionierendes Beispiel zeigen kann, ohne dass jemand 'CommandA',' CommandB' und 'CommandRest' haben muss. Ich habe es jetzt aktualisiert, bitte schauen Sie nochmal. –

+0

Danke für die Aktualisierung Ihrer Antwort ~ Vielleicht a Zum Beispiel, wenn ich den "read" -Befehl in zwei Terminals verwenden möchte und dann, nachdem jeder Tastatur erhalten hat, schreibe ich "echo finish input" als commandRest. Ich habe versucht, mit Ihrer Methode zu implementieren, aber es hat gewonnen 't Arbeit, weil ich an der Eingabe stecken werde. Und wenn ich versuche, neues Terminal mit "gnome-terminal -e" -Befehl in Komma zu öffnen ndA und CommandB können zwei neue Terminals gleichzeitig angezeigt werden, aber der commandRest wartet nicht auf meine Eingabe und echo nur aus. Also ich möchte wissen, wie man es repariert. Vielen Dank! –

0

Wie Sie mit Fifo-basierten Synchronisation nicht allzu gut scheinen zu tun, könnten Sie Vielleicht versuchen Sie mit GNU Parallel, die, wenn installiert, erstellt eine symbolische Verbindung namens sem, die als Semaphor fungiert.

Also, in Terminal 1, würden Sie tun:

sem -j 2 --id mark CommandA 

und im Terminal 2, würden Sie tun:

sem -j 2 --id mark CommandB 

Dann überall Sie beide warten wollten Sie zu beenden, würde tun:

sem --id mark --wait ; CommandRest 
+0

Danke für zusätzlichen Rat. Ich habe 'Sleep 10' als CommandA und CommandB versucht und es hat gut funktioniert. Wenn ich jedoch "read" sowohl als "CommandA" als auch als "CommandB" verwende, wird "echo" als "CommandRest" empfangen, und die ersten beiden bleiben hängen und können keine Tastatureingabe empfangen. Wenn ich die ersten zwei Terminals geschlossen habe, zeigt das dritte Terminal tatsächlich "empfangen" an. Das Problem ist also, dass der Befehl 'read' unter diesen Umständen nicht gut funktionieren kann. Kannst du das reparieren? –