![Executar e salvar log](https://rvso.com/image/913182/Executar%20e%20salvar%20log.png)
Estou executando o script nos Argumentos via loop e salvando os logs em um arquivo. Como usar o comando Args para executar de uma só vez. Abaixo tentei args -n -500
Mas isso não salva logs. Como anexar para salvar logs aqui?
Responder1
Eu acho que você só precisagrupoos comandos do loop interno e redirecionam sua saída para um arquivo indexado pelo mesmo índice $i
e, em seguida, enviam todos juntos em segundo plano &
. Algo como
for i in $(cat $file_name)
do
(echo "$i"; /path/script.pl "$i") >> "${file_save}-${i}" &
done
Além disso for
, cat
neste caso, eu usaria while
e read
de alguma forma assim:
#!/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"
Aqui 2>&1
é adicionado caso você queira ter as mensagens de erro em seu arquivo de log. Mais sobre a construção IFS= read -r line
pode ser encontrada nesteresposta enciclopédicafornecido por @StéphaneChazelas.
Além disso, se a execução ./script.pl
demorar muito, você poderá se desconectar do shell atual caso feche acidentalmente a janela do terminal onde o script principal foi iniciado. Para isso você pode usarnohup mycommand &
em vez disso, apenas &
.
De acordo com o cenário acima, provavelmente a maneira mais fácil de mesclar todos os logs em um arquivo é usar um loop novamente (depois que todos os trabalhos do script principal terminarem) da seguinte maneira:
#!/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"
Isso também deve 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"
Responder2
Se a ordem de gravação não importa,
for i in $(cat $file_name);do echo $i; ./script.pl $i>>file & done
Isso é paralelo.