
Я долго искал наилучшую практику для этого сценария.
Если у меня есть процесс2, который зависит от процесса1, запущенного заранее. Я настраиваю псевдоним, например:
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
выхода?
решение1
Просто добавьте kill $!
в конец:process1 & process2; kill $!
$!
является переменной (в Bash ее ошибочно называют «параметром») и будетрасширятьк последнему фоновому PID в любом месте:
Расширяется до идентификатора процесса задания, которое было последним переведено в фоновый режим, независимо от того, выполнялось ли оно как асинхронная команда или с использованием встроенной функции bg (см. УПРАВЛЕНИЕ ЗАДАНИЯМИ ниже).
%%
является специальным и будет расширяться только до последнего фонового PID в контексте встроенных команд оболочки, таких как fg
и kill
. К сожалению, это не ясно из man
страницы:
Символы %% и %+ относятся к понятию оболочки текущей задачи, которая является последней задачей, остановленной, пока она находилась на переднем плане или была запущена в фоновом режиме.
PS: Если вам нужно сделать это командной строкой, убедитесь, kill $!
что она заключена в одинарные кавычки, чтобы она была расширена во время выполнения. Еще лучше, напишите функцию вместо псевдонима, чтобы избежать ихограничения.