아래 스크립트에 문제가 있습니다. for 루프의 일부 SQL 문을 사용하여 변수를 설정하고 로그 파일을 생성합니다. 현재 데이터베이스는 +- 1200줄의 출력을 생성합니다.
원본 버전에는 각 루프(디스크에 대한 한 번의 쓰기 작업)에 대해 텍스트 파일(report.csv)에 한 줄을 추가하는 주석 처리된 에코 줄이 있습니다.
새로운 예상 버전은 데이터를 배열(dcimlog)에 추가한 다음 newreport.csv의 전체 데이터 세트에 대해 한 번의 쓰기 작업만 수행합니다.
내 문제는 어떻게든 하위 프로세스가 배열을 올바르게 추가하지 않아서 newreport.csv에 for 루프 이전에 완료된 첫 번째 행만 포함되고 하위 프로세스에 의해 추가되지 않는다는 것입니다.
줄의 순서는 중요하지 않지만 실행 속도는 중요하므로 "do () &" - 이것이 실패의 원인일 수 있다고 생각합니다...
어떻게 작동하게 만들 수 있는지 아시나요?
N=$(nproc) dcimlog=();dcimlog=("${dcimlog[@]}" "뭔가") # 유효함 나는 "${sqlanswer[@]}"에서 수행합니다. (echo somework #SQL에서 데이터 가져오기 # echo "$DDeviceID;$NBPort;$PortNumber;$CConnectedDevice;$Connectedport;$CabinetLocation;$HeightDevice;$PositionDevice;$ZoneName;$DataCenterName" >> 보고서.csv dcimlog=("${dcimlog[@]}" "$DDeviceID;$NBPort;$PortNumber;$CConnectedDevice;$Connectedport;$CabinetLocation;$HeightDevice;$PositionDevice;$ZoneName;$DataCenterName") # 작동하지 않음 )& if [[ $(jobs -r -p | wc -l) -gt $N ]]; 잠깐만요 필리핀 제도 완벽한 기다리다 echo "${dcimlog[@]}" > newreport.csv
답변1
이전 과 마찬가지로 전체 루프의 표준 출력을 file 로 report.csv
내부적 으로 리디렉션하는 것을 고려해보세요. echo
좋다
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