Ejecuta múltiples comandos paralelos a la vez en la misma terminal

Quiero ejecutar algunos comandos, cada uno de los cuales no se cierra hasta que se presiona Ctrl-C. ¿Hay algo que pueda ejecutar para ejecutarlos todos a la vez, y Ctrl-C los abandonará a todos? Pueden compartir la salida del terminal.

Específicamente, tengo el comstackdor de la brújula, el comstackdor de coffeescript y un comando personalizado que observa los cambios en los archivos mientras observa los cambios en los archivos. No quiero cargar una terminal para cada comando.

Este script bash es para N hilos paralelos. Cada argumento es un comando.

trap mataría todos los subprocesos cuando SIGINT quede atrapado.
wait $PID_LIST espera a que se complete cada proceso. Cuando todos los procesos se hayan completado, el progtwig finalizará.

 #!/bin/bash for cmd in "$@"; do { echo "Process \"$cmd\" started"; $cmd & pid=$! PID_LIST+=" $pid"; } done trap "kill $PID_LIST" SIGINT echo "Parallel processes have started"; wait $PID_LIST echo echo "All processes have completed"; 

Guarde este script como parallel_commands y hágalo ejecutable.
Esta es la forma de usar este script:

 parallel_commands "cmd arg0 arg1 arg2" "other_cmd arg0 arg2 arg3" 

Ejemplo:

 parallel_commands "sleep 1" "sleep 2" "sleep 3" "sleep 4" 

Comience 4 sleep paralelo y espere hasta que termine “sleep 4”.

Basado en el comentario de @ alessandro-pezzato, para ejecutar comandos de múltiples, simplemente use & , entre los comandos.

Ejemplo:

 $ sleep 3 & sleep 5 & sleep 2 & 

Ejecutará los comandos en segundo plano.

Use GNU Parallel:

 (echo command1; echo command2) | parallel parallel ::: command1 command2 

Matar:

 parallel ::: command1 command2 & PID=$! kill -TERM $PID kill -TERM $PID 

Sugiero una utilidad mucho más simple que acabo de escribir. Actualmente se llama par, pero se cambiará de nombre pronto a parl o pll, aún no se ha decidido.

https://github.com/k-bx/par

API es tan simple como:

 par "script1.sh" "script2.sh" "script3.sh" 

Los comandos de prefijación se pueden hacer a través de:

 par "PARPREFIX=[script1] script1.sh" "script2.sh" "script3.sh" 

Se puede hacer con Makefile simple:

 sleep%: sleep $(subst sleep,,$@) @echo $@ done. 

Use la opción -j .

 $ make -j sleep3 sleep2 sleep1 sleep 3 sleep 2 sleep 1 sleep1 done. sleep2 done. sleep3 done. 

Sin la opción -j se ejecuta en serie.

 $ make -j sleep3 sleep2 sleep1 sleep 3 sleep3 done. sleep 2 sleep2 done. sleep 1 sleep1 done. 

También puede ejecutar en seco con la opción `-n ‘.

 $ make -j -n sleep3 sleep2 sleep1 sleep 3 sleep 2 sleep 1 

Para ejecutar comandos múltiples simplemente agregue && entre dos comandos como este: command1 && command2

Y si quieres ejecutarlos en dos terminales diferentes, hazlo así:

 gnome-terminal -e "command1" && gnome-terminal -e "command2" 

Esto abrirá 2 terminales con command1 y command2 ejecutándose en ellos.

Espero que esto te ayude.