bash compartilha o array no loop “for do () & wait”

0

Eu tenho um problema com o script abaixo. Ele usa algumas instruções sql em um loop for para definir variáveis e produz um arquivo de log. O atual db produz + - 1200 linhas de saída.

A versão original é com a linha de eco comentada, ela adiciona uma linha a um arquivo de texto (report.csv) para cada loop (uma operação de gravação em disco).

A nova versão pretendida acrescentaria os dados a uma matriz (dcimlog) e faria apenas uma operação de gravação para todo o conjunto de dados em newreport.csv.

Meu problema é que, de alguma forma, a matriz não é anexada corretamente pelos processos filhos, portanto, newreport.csv contém apenas a primeira linha feita antes do loop for e não é anexada por nenhum filho.

A ordem das linhas não é importante, mas a velocidade de execução é, portanto, o "do () &" - que eu acredito que seja o motivo do fracasso ...

Alguma ideia de como posso fazer isso funcionar?

N=$(nproc)
dcimlog=();dcimlog=("${dcimlog[@]}" "some stuff") # works
for i in "${sqlanswer[@]}"; do
    ( echo somework #get the data from sql
    #   echo "$DDeviceID;$NBPort;$PortNumber;$CConnectedDevice;$Connectedport;$CabinetLocation;$HeightDevice;$PositionDevice;$ZoneName;$DataCenterName" >> report.csv
    dcimlog=("${dcimlog[@]}" "$DDeviceID;$NBPort;$PortNumber;$CConnectedDevice;$Connectedport;$CabinetLocation;$HeightDevice;$PositionDevice;$ZoneName;$DataCenterName") # does not work
) &
    if [[ $(jobs -r -p | wc -l) -gt $N ]]; then
            wait -n
    fi
done
wait
echo "${dcimlog[@]}" > newreport.csv
    
por user1747036 20.10.2018 / 15:15

1 resposta

1

Pense em redirecionar o stdout do loop inteiro para o arquivo report.csv e, em apenas echo , como você fez antes. Como

for i in "${sqlanswer[@]}"; do
    ( echo somework #get the data from sql
      echo "$DDeviceID;$NBPort;$PortNumber;$CConnectedDevice;$Connectedport;$CabinetLocation;$HeightDevice;$PositionDevice;$ZoneName;$DataCenterName"
    ) &
  done > report.csv
    
por 20.10.2018 / 17:38

Tags