![Ejecutar y guardar registro](https://rvso.com/image/913182/Ejecutar%20y%20guardar%20registro.png)
Estoy ejecutando un script en los Argumentos mediante un bucle y guardando registros en un archivo. Cómo utilizar el comando Args para ejecutarlo todo a la vez. A continuación se probaron argumentos -n -500
Pero esto no guarda registros. ¿Cómo agregar para guardar registros aquí?
Respuesta1
Creo que solo necesitasgrupolos comandos del bucle interno y redirigen su salida a un archivo indexado por el mismo índice $i
, luego empujan todos juntos en segundo plano &
. Algo como
for i in $(cat $file_name)
do
(echo "$i"; /path/script.pl "$i") >> "${file_save}-${i}" &
done
También en lugar for
y cat
en este caso usaría while
y read
de alguna manera así:
#!/bin/bash
file_name='in_file'
while IFS= read -r i
do
(echo "$i"; /path/script.pl "$i") >> "${file_save}-${i}" 2>&1 &
done < "$file_name"
Aquí 2>&1
se agrega en caso de que desee tener los mensajes de error en su archivo de registro. Más información sobre la construcción IFS= read -r line
se puede encontrar en esterespuesta enciclopédicaproporcionado por @StéphaneChazelas.
Además, si la ejecución ./script.pl
lleva mucho tiempo, puede desconectarse del shell actual en caso de que cierre accidentalmente la ventana del terminal donde se inició el script principal. Para ello puedes utilizarnohup mycommand &
en lugar de eso solo &
.
De acuerdo con el escenario anterior, probablemente la forma más fácil de fusionar todos los registros en un archivo es usar un bucle nuevamente (una vez que finalicen todos los trabajos del script principal) de esta manera:
#!/bin/bash
file_name='in_file'
merged_log='out_file'
>"$merged_log" # empty the merged log file - not mandatory if the file doesn't exist
while IFS= read -r i
do
cat "${file_save}-${i}" >> "$merged_log"
rm "${file_save}-${i}"
done < "$file_name"
Esto también debería funcionar:
#!/bin/bash
file_name='in_file'
merged_log='out_file'
while IFS= read -r i
do
cat "${file_save}-${i}"
rm "${file_save}-${i}"
done < "$file_name" > "$merged_log"
Respuesta2
Si el orden de escritura no importa,
for i in $(cat $file_name);do echo $i; ./script.pl $i>>file & done
Esto es paralelo.