Aprende cómo ejecutar comandos simultáneamente en Linux con GNU Parallel. Tu centro de datos depende Linux, entonces ¿por qué no aprovechar al máximo la línea de comandos con GNU Parallel?
Si te encuentras en una situación en la que necesitas ejecutar varios comandos al mismo tiempo (por ejemplo, en los servidores Linux de un centro de datos), ¿qué haces? GNU Parallel es una alternativa interesante que debes conocer.
Cuando se ejecutan comandos en Linux, ya sea uno a la vez en la línea de comandos o desde un script de bash, los comandos se ejecutan en secuencia. El primer comando se ejecuta, seguido por el segundo, seguido por el tercero. Es cierto, el tiempo entre los comandos es tan minúsculo, que el ojo humano no se daría cuenta. Pero para algunos casos, puede que no sea el medio más eficiente para ejecutar comandos.
1. ¿Qué es GNU Parallel?
¿Alguna vez tuviste la extraña sensación de que tu computadora no es tan rápida como debería ser? Solía sentirme así, y luego encontré GNU Parallel. GNU Parallel es una herramienta de shell que permite la ejecución de trabajos en paralelo.
Un trabajo puede ser un único comando o entrada de un archivo que contiene elementos tales como una lista de comandos, una lista de archivos, una lista de hosts, una lista de usuarios, una lista de URL o una lista de tablas. GNU Parallel también puede tomar información de un comando con pipes (|)
Quiero mostrarte cómo instalar GNU Parallel y luego los conceptos básicos de su uso.
2. Instalación
GNU Parallel se puede instalar en casi cualquier distribución de Linux. Dado que GNU Parallel se encuentra en el repositorio estándar, la instalación es simple. Abra una ventana de terminal y emita el siguiente comando:
#Ubuntu
sudo apt install parallel
#Fedora
sudo dnf install parallel
Una vez finalizada la instalación, querrás silenciar el banner de citación. Esto se pone en marcha para asegurar que cualquiera que use Paralelo de GNU puedan ver la cita de los desarrolladores.
Para silenciar el banner de citas, emita el comando:
parallel --bibtex
A continuación, se le dará la información de citas y se le pedirá que escriba lo siguiente:
will cite
Ahora está listo para usar GNU Parallel.
3. Uso de GNU Parallel
La forma más sencilla de demostrar GNU Parallel es utilizando el comando echo. Digamos que queremos usar el comando echo para imprimir uno dos tres cuatro. El comando para esto sería:
echo "uno dos tres cuatro"
Ese mismo comando, usando parallel sería:
parallel echo ::: uno dos tres cuatro
La salida para lo anterior se vería así:
También podríamos dar dos datos de entrada de esta manera:
parallel echo ::: 1 2 3 4 ::: A B C D
Como puede ver, delimitamos el comando desde las variables de entrada con los caracteres :::. También puede utilizar archivos como entrada para el comando. Déjame demostrarte. Cree dos archivos. El primero, llamado abc con el contenido:
A
B
C
D
E
F
G
H
I
K
El segundo archivo, denominado 123, que tendrá como contenido:
1
2
3
4
5
6
7
8
9
10
Ahora usamos esos dos archivos para generar resultados. El comando para esto podría verse así:
parallel -a abc -a 123 echo
Ahora, si tus archivos de entrada no tienen la misma longitud, ¿qué se hace? GNU Parallel ajustará la salida del archivo más corto, por lo que coincidirá con el archivo más largo. Sin embargo, ¿qué pasa si queremos ganar un poco más de control de esa salida? En lugar de la repetición paralela de GNU (para hacer coincidir las entradas):
1 A
1 A
1 A
1 A
1 A
2 B
2 B
2 B
2 B
2 B
Es posible utilizar el argumento –xapply. Digamos que tenemos el archivo 123-10 con 10 líneas de entrada (1,2,3,4,5,6,7,8,9,10 – un número por línea) y el archivo abc-5 con cinco líneas de entrada (A,B,C,D,E – un carácter por línea). Emita el comando:
parallel --xapply -a 123-10 -a abc-5 echo
Verá que GNU Parallel solo imprimirá los contenidos de 123-10 una vez, pero repetirá los contenidos del archivo abc-5 hasta que coincida con la longitud de 10 archivos:
4. Uso con comandos
Hasta ahora solo hemos estado usando el comando echo para generar caracteres. Veamos un ejemplo que realmente usa comandos. Digamos que tenemos un directorio llamado TEST. Dentro de esa carpeta hay un archivo llamado archivo y un subdirectorio llamado C1 que contiene los archivos archivo y archivo2.
Digamos que queremos cambiar el nombre de archivo a archivo1, cambiar el nombre de archivo1 a archivo2, hacer tar a la carpeta C1 y luego renombrar ese archivo tar. Entonces podríamos crear un archivo con los siguientes contenidos:
mv archivo archivo1
mv archivo1 archivo2
tar cfz C1.tar.gz C1
mv C1.tar.gz C2.tar.gz
Guarde y cierre ese archivo, nombrándolo como geek (para este ejemplo). Ahora tomamos la información de los ‘trabajos’ con el comando parallel, así:
parallel --jobs 4 < geek
La opción –jobs indica a GNU Parallel cuántos comandos se permiten ejecutar. En nuestro caso, tenemos 4 comandos. Si hubiera más comandos que jobs permitidos, los comandos restantes se colocarían en una cola. En términos generales, es seguro permitir más trabajos que comandos. Entonces emitiendo el comando:
parallel --jobs 6 < geek
Estaría bien.
No habrá salida del comando. Si cambia al directorio TEST, verá que todo ha cambiado, de acuerdo con nuestro archivo de comandos de entrada.
5. Conclusión
Acabamos de arañar la superficie de GNU Parallel. Le recomiendo que lea el GNU Parallel tutorial oficial para que pueda entender las complejidades de la herramienta (de las cuales hay muchas). Pero esto le ayudará a empezar a usar los comandos con más eficiencia.
¡Pruébalo hoy! Por favor, ¡No olvides compartirlo! :’)