Убить первую команду, как только выйдет вторая

382
Elist

Я долго искал лучшую практику для этого сценария.

Если у меня есть process2, это зависит от процесса, запущенного заранее. Я создал псевдоним как:

alias both='process1 & process2' 

Затем, когда процесс2 завершается, я бы хотел, чтобы процесс1 также завершился (мое текущее решение - вернуться к терминалу и kill %%).

Например (для подключения к устройству iOS с Mac через USB):

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

Как мне продолжать iproxyбежать и убить его, как только sshвыйдет?

4
Просто отдельно, у вас есть больше информации о подключении к iOS через USB через SSH? tjt263 7 лет назад 0
@ tjt263 - очевидно, работает только для взломанных устройств ... Elist 7 лет назад 0
@ tjt263, я действительно не понимаю, о чем ты меня просишь. Можете ли вы сказать прямо, какую информацию вы ищете? Elist 7 лет назад 0
Не думаю, что я могу сделать это намного проще, чем это ... Я никогда не слышал о `iproxy` или` ssh` через USB, и мне просто любопытно. Я даже не знаю достаточно об этом, чтобы быть более конкретным. tjt263 7 лет назад 0
Хорошо. `iproxy` - это утилита для перенаправления локального порта на порт на мобильном устройстве Apple, подключенном через USB. Это часть проекта с открытым исходным кодом libimobiledevice. В приведенном выше примере `localhost: 2222` перенаправляется на порт 22 на подключенном iphone. У iPhone есть демон `ssh`, прослушивающий порт 22. Что-нибудь еще, что вы хотите, чтобы я расширил? Elist 7 лет назад 0
См. Https://github.com/libimobiledevice/libusbmuxd/blob/master/tools/iproxy.c и http://iphonedevwiki.net/index.php/SSH_Over_USB. Elist 7 лет назад 0

1 ответ на вопрос

4
l0b0

Просто добавьте kill $!в конец:process1 & process2; kill $!

$!является переменной (в Bash, которая до смешного называется «параметром») и будет расширяться до последнего фонового PID в любом месте:

Расширяется до идентификатора процесса задания, которое в последний раз помещается в фоновом режиме, независимо от того, выполняется ли оно как асинхронная команда или с помощью встроенной команды bg (см. УПРАВЛЕНИЕ ЗАДАНИЯМИ ниже).

%%является особенным и расширяется только до последнего фонового PID в контексте встроенных команд оболочки, таких как fgи kill. К сожалению, это не ясно со manстраницы:

Символы %% и% + относятся к понятию оболочки текущего задания, которое является последним заданием, остановленным, когда оно находилось на переднем плане или началось в фоновом режиме.


PS: Если вам нужно сделать это командной строкой, убедитесь, что kill $!она заключена в одинарные кавычки, чтобы она расширялась во время выполнения. Еще лучше написать функцию вместо псевдонима, чтобы избежать их ограничений .

Большой! на самом деле, это намного проще, чем я думал ... Кстати, вы можете объяснить `$!` vs `%%`? Elist 7 лет назад 0
Отлично; Я согласен, re: function> alias. tjt263 7 лет назад 0