Töte den ersten Befehl, sobald die zweite beendet ist

405
Elist

Ich habe lange nach Best Practice für dieses Szenario gesucht.

Wenn ich process2 habe, hängt das davon ab, dass process1 vorher läuft. Ich habe einen Alias ​​wie:

alias both='process1 & process2' 

Wenn Prozess2 dann beendet wird, möchte ich, dass Prozess1 ebenfalls beendet wird (meine derzeitige Lösung besteht darin, zum Terminal zurückzukehren und kill %%).

Zum Beispiel (um eine Verbindung zu einem iOS-Gerät von Mac über USB herzustellen):

alias usbssh='/usr/local/bin/iproxy 2222 22 & ssh -p 2222 root@localhost' 

Wie renne ich weiter iproxyund töte es sobald es beendet wird ssh?

4
Haben Sie einfach mehr Informationen? Verbinden Sie sich per USB mit USB über SSH? tjt263 vor 6 Jahren 0
@ tjt263 - funktioniert natürlich nur bei Geräten mit Jailbreak ... Elist vor 6 Jahren 0
@ tjt263, ich verstehe wirklich nicht, was du mich fragst. Können Sie bitte explizit sagen, nach welchen Informationen Sie suchen? Elist vor 6 Jahren 0
Ich glaube nicht, dass ich es viel einfacher machen kann als das. Ich habe noch nie von "iproxy" oder "ssh" über USB gehört und ich bin nur neugierig. Ich weiß gar nicht genug darüber, um genauer zu sein. tjt263 vor 6 Jahren 0
OK. "iproxy" ist ein Dienstprogramm zum Portieren des lokalen Ports an einen Port auf einem mobilen Apple-Gerät, das über USB verbunden ist. Es ist ein Teil des Open-Source-Projekts "libimobiledevice". Im obigen Beispiel wird "localhost: 2222" an Port 22 des angeschlossenen iPhone weitergeleitet. Das iPhone verfügt über einen `ssh`-Daemon, der an Port 22 abgehört wird. Möchten Sie noch etwas erweitern? Elist vor 6 Jahren 0
Siehe https://github.com/libimobiledevice/libusbmuxd/blob/master/tools/iproxy.c und http://iphonedevwiki.net/index.php/SSH_Over_USB. Elist vor 6 Jahren 0

1 Antwort auf die Frage

4
l0b0

Einfach kill $!am Ende anhängen :process1 & process2; kill $!

$!ist eine Variable (verwirrenden als „Parameter“ in Bash bekannt), und erweitert überall auf den letzten Hintergrund PID:

Wird auf die Prozess-ID des zuletzt im Hintergrund platzierten Jobs erweitert, unabhängig davon, ob er als asynchroner Befehl ausgeführt wird oder das bg builtin verwendet (siehe JOB CONTROL unten).

%%ist etwas Besonderes und wird nur im Rahmen von Shell-Befehlen wie fgund bis zum letzten Hintergrund erweitert kill. Leider ist das nicht klar von der manSeite:

Die Symbole %% und% + beziehen sich auf die Vorstellung der Shell vom aktuellen Job. Dies ist der letzte Job, der angehalten wurde, während er im Vordergrund war oder im Hintergrund gestartet wurde.


PS: Wenn Sie dies als Befehlszeichenfolge festlegen müssen, stellen Sie sicher, dass kill $!es ein einfaches Anführungszeichen gibt, damit es zur Laufzeit erweitert wird. Besser noch, schreiben Sie eine Funktion anstelle eines Alias, um deren Einschränkungen zu vermeiden .

Großartig! Eigentlich ist es viel einfacher als ich dachte ... Übrigens, können Sie $! `vs %%` erklären? Elist vor 6 Jahren 0
Ausgezeichnet; Ich stimme zu, re: function> Alias. tjt263 vor 6 Jahren 0