Mate o primeiro comando assim que o segundo sair

Mate o primeiro comando assim que o segundo sair

Há muito tempo procuro as melhores práticas para esse cenário.

Se eu tiver o processo2, isso depende do processo1 em execução antecipadamente. Eu configurei um alias como:

alias both='process1 & process2'

Então, quando o process2 sair, eu gostaria que o process1 também saísse (minha solução atual é voltar ao terminal e kill %%).

Por exemplo (para conectar-se a um dispositivo iOS do Mac via USB):

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

Como faço para continuar iproxycorrendo e matá-lo assim que sshsair?

Responder1

Basta acrescentar kill $!no final:process1 & process2; kill $!

$!é uma variável (confusamente conhecida como "parâmetro" no Bash) e iráexpandirpara o último PID de fundo em qualquer lugar:

Expande para o ID do processo do trabalho colocado mais recentemente em segundo plano, seja executado como um comando assíncrono ou usando o bg integrado (consulte JOB CONTROL abaixo).

%%é especial e só se expandirá para o último PID de segundo plano no contexto de comandos integrados do shell como fge kill. Infelizmente, isso não está claro na manpágina:

Os símbolos %% e %+ referem-se à noção do shell do trabalho atual, que é o último trabalho interrompido enquanto estava em primeiro plano ou iniciado em segundo plano.


PS: Se você precisar transformar isso em uma string de comando, certifique-se kill $!de que esteja entre aspas simples para que seja expandido em tempo de execução. Melhor ainda, escreva uma função em vez de um alias para evitar sualimitações.

informação relacionada