Quiero ejecutar múltiples comandos (procesos) en un solo shell. Todos tienen salida continua propia y no se detienen. Correr en los saltos de fondo Ctrl- C. Me gustaría ejecutarlos como un solo proceso (¿subshell, tal vez?) Para poder detenerlos a todos con Ctrl- C.
Para ser específicos, quiero ejecutar pruebas unitarias con mocha
(modo de observación), ejecutar el servidor y ejecutar algún preprocesamiento de archivos (modo de observación) y ver la salida de cada uno en una ventana de terminal. Básicamente quiero evitar usar algún corredor de tareas.
Puedo darme cuenta ejecutando procesos en segundo plano ( &
), pero luego tengo que ponerlos en primer plano para detenerlos. Me gustaría tener un proceso para envolverlos y cuando detengo el proceso, detiene a sus 'hijos'.
fuente
Respuestas:
Para ejecutar comandos simultáneamente, puede usar el
&
separador de comandos.Esto comenzará
command1
, luego lo ejecuta en segundo plano. Lo mismo concommand2
. Entonces comienzacommand3
normalmente.La salida de todos los comandos se confundirá, pero si eso no es un problema para usted, esa sería la solución.
Si desea ver más adelante la salida por separado, puede canalizar la salida de cada comando
tee
, lo que le permite especificar un archivo para reflejar la salida.La salida probablemente será muy desordenada. Para contrarrestar eso, podría darle un prefijo a la salida de cada comando
sed
.Entonces, si juntamos todo eso, obtenemos:
Esta es una versión altamente idealizada de lo que probablemente va a ver. Pero es lo mejor que puedo pensar en este momento.
Si desea detenerlos todos a la vez, puede usar la compilación
trap
.Esto se ejecutará
command1
ycommand2
en segundo plano ycommand3
en primer plano, lo que le permite matarlo con Ctrl+ C.Cuando matas el último proceso con Ctrl+, Clos
kill %1; kill %2
comandos se ejecutan, porque conectamos su ejecución con la recepción de un INTERupt SIGnal, lo que se envía presionando Ctrl+ C.Matan, respectivamente, el primer y segundo proceso de fondo (tu
command1
ycommand2
). No olvides quitar la trampa, una vez que hayas terminado de usar tus comandostrap - SIGINT
.Monstruo completo de un comando:
Podría, por supuesto, echar un vistazo a la pantalla . Le permite dividir su consola en tantas consolas separadas como desee. Entonces puede monitorear todos los comandos por separado, pero al mismo tiempo.
fuente
Puede eliminar fácilmente un montón de procesos a la vez si decide ejecutarlos (y solo ellos) en el mismo grupo de procesos .
Linux proporciona la utilidad
setsid
para ejecutar un programa en un nuevo grupo de procesos (incluso en una nueva sesión, pero eso no nos importa). (Esto es factible pero más complicado sin élsetsid
).La ID de grupo de proceso (PGID) de un grupo de proceso es la ID de proceso del proceso padre original en el grupo. Para eliminar todos los procesos en un grupo de procesos, pase el negativo del PGID a la
kill
llamada o comando del sistema. El PGID sigue siendo válido incluso si el proceso original con este PID muere (aunque puede ser un poco confuso).Si ejecuta los procesos en segundo plano desde un shell no interactivo , todos permanecerán en el grupo de procesos del shell. Solo en los shells interactivos los procesos en segundo plano se ejecutan en su propio grupo de procesos. Por lo tanto, si bifurca los comandos de un shell no interactivo que permanece en primer plano, Ctrl+ Clos matará a todos. Use el
wait
incorporado para hacer que el shell espere a que salgan todos los comandos.fuente
Me sorprende que esto aún no esté aquí, pero mi forma favorita de hacerlo es usar subcapas con comandos de fondo. Uso:
(command1 & command2 & command3)
La salida es visible desde ambos, todos los comandos bash y las comodidades aún están disponibles, y un solo los Ctrl-cmata a todos. Por lo general, uso esto para iniciar un servidor de archivos de cliente de depuración en vivo y un servidor de fondo al mismo tiempo, por lo que puedo eliminarlos fácilmente cuando quiera.
La forma en que esto funciona es eso
command1
y secommand2
está ejecutando en el fondo de una nueva instancia de subshell, ycommand3
está en primer plano de esa instancia, y la subshell es lo que primero recibe la señal de Ctrl-capagado de una pulsación de tecla. Es muy parecido a ejecutar un script bash con respecto a quién posee qué proceso y cuándo se matan los programas en segundo plano.fuente
wait
como el comando final (comando3 en su ejemplo), puede ejecutar el código de limpieza después de que el usuario presione Ctrl-c.Puedes usar el punto
;
y coma o&&
así:fuente
Puedes usar a
pipe
. Esto iniciará los comandos en ambos extremos de la tubería al mismo tiempo. Usted debe ser capaz de detener todos los comandos con elCTRL-C
también.1st command | 2nd command | 3rd command
Si desea ejecutar los comandos uno tras otro, puede usar el método de @ serenesat.
fuente