
He estado buscando las mejores prácticas para este escenario durante mucho tiempo.
Si tengo el proceso2, eso depende de que el proceso1 se ejecute de antemano. Configuré un alias como:
alias both='process1 & process2'
Luego, cuando el proceso2 salga, me gustaría que el proceso1 también salga (mi solución actual es volver a la terminal y kill %%
).
Por ejemplo (para conectarse a un dispositivo iOS desde Mac a través de USB):
alias usbssh='/usr/local/bin/iproxy 2222 22 & ssh -p 2222 root@localhost'
¿Cómo sigo iproxy
ejecutando y lo mato tan pronto como ssh
sale?
Respuesta1
Simplemente agregue kill $!
al final:process1 & process2; kill $!
$!
es una variable (conocida confusamente como "parámetro" en Bash) yexpandiral último PID de fondo en cualquier lugar:
Se expande al ID de proceso del trabajo colocado más recientemente en segundo plano, ya sea que se ejecute como un comando asíncrono o usando el comando bg incorporado (consulte CONTROL DE TRABAJO a continuación).
%%
es especial y solo se expandirá al último PID de fondo en el contexto de comandos integrados del shell como fg
y kill
. Lamentablemente, esto no queda claro en la man
página:
Los símbolos %% y %+ se refieren a la noción del shell del trabajo actual, que es el último trabajo detenido mientras estaba en primer plano o iniciado en segundo plano.
PD: Si necesita convertir esto en una cadena de comando, asegúrese de que kill $!
esté entre comillas simples para que se expanda en tiempo de ejecución. Aún mejor, escriba una función en lugar de un alias para evitar sulimitaciones.