GNU/Linux >> Tutoriales Linux >  >> Linux

¿Ejecutar comandos canalizados en paralelo?

Considere el siguiente escenario. Tengo dos programas A y B. El programa A da salida a líneas estándar de cadenas mientras que el programa B procesa líneas desde la entrada estándar. La forma de utilizar estos dos programas es, por supuesto:

[correo electrónico protegido]:~$ A | B

Ahora me he dado cuenta de que esto consume solo un núcleo; por eso me pregunto:

¿Los programas A y B comparten los mismos recursos computacionales? Si es así, ¿hay alguna forma de ejecutar A y B al mismo tiempo?

Otra cosa que he notado es que A se ejecuta mucho más rápido que B, por lo tanto, me pregunto si de alguna manera podría ejecutar más programas B y dejar que procesen las líneas que genera A en paralelo.

Es decir, A generaría sus líneas y habría N instancias de programas B que leerían estas líneas (quien las lea primero), las procesaría y las generaría en la salida estándar.

Así que mi pregunta final es:

¿Hay alguna forma de canalizar la salida a A entre varios procesos B sin tener que ocuparse de las condiciones de carrera y otras incoherencias que podrían surgir?

Respuesta aceptada:

Un problema con split --filter es que la salida se puede mezclar, por lo que obtiene media línea del proceso 1 seguida de media línea del proceso 2.

GNU Parallel garantiza que no habrá confusión.

Así que asume que quieres hacer:

 A | B | C

Pero ese B es terriblemente lento y, por lo tanto, desea paralelizarlo. Entonces puedes hacer:

A | parallel --pipe B | C

GNU Parallel por defecto se divide en \n y un tamaño de bloque de 1 MB. Esto se puede ajustar con –recend y –block.

Puede encontrar más información sobre GNU Parallel en:http://www.gnu.org/s/parallel/

Puede instalar GNU Parallel en solo 10 segundos con:

$ (wget -O - pi.dk/3 || lynx -source pi.dk/3 || curl pi.dk/3/ || \
   fetch -o - http://pi.dk/3 ) > install.sh
$ sha1sum install.sh | grep 67bd7bc7dc20aff99eb8f1266574dadb
12345678 67bd7bc7 dc20aff9 9eb8f126 6574dadb
$ md5sum install.sh | grep b7a15cdbb07fb6e11b0338577bc1780f
b7a15cdb b07fb6e1 1b033857 7bc1780f
$ sha512sum install.sh | grep 186000b62b66969d7506ca4f885e0c80e02a22444
6f25960b d4b90cf6 ba5b76de c1acdf39 f3d24249 72930394 a4164351 93a7668d
21ff9839 6f920be5 186000b6 2b66969d 7506ca4f 885e0c80 e02a2244 40e8a43f
$ bash install.sh

Mira el video de introducción en http://www.youtube.com/playlist?list=PL284C9FF2488BC6D1


Linux
  1. 5 comandos de solución de problemas de red de Linux

  2. Mis 8 comandos prácticos favoritos de Linux

  3. Hoja de referencia de comandos de IPtables

  4. ¿En qué orden se ejecutan los comandos canalizados?

  5. ¿Qué Bash se está ejecutando?

Comandos de Nmap con ejemplos

Comandos YUM

Conceptos básicos de la línea de comandos de Linux:ejecución de comandos desde la línea de comandos

Hacer comandos de impresión de CMake antes de ejecutar

Bash:ejecutar comandos desde dentro de un chroot y cambiar de usuario

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