저는 GNU 병렬성에 대해 배우고 있는데 이것이 의미가 있는지 궁금합니다.
큰 타격:
IFS=" "
while read field || [ -n "$field" ]; do
targets_array+=("$field")
done </location/targets
parallel -Dall bash myScript.sh ::: $targets_array
내 출력이 어느 시점에서 중지되는 것 같기 때문에 이것이 의미가 있는지 궁금합니다 ... myScript.sh를 사용하여 30,000개의 대상을 스캔한 다음 myScript.sh를 사용하여 데이터베이스에서 해당 대상에 대한 정보를 업데이트했습니다.
몇 가지 옵션을 사용해 보았지만 제대로 작동하지 못했습니다. 성능 관점에서 로그 파일에 쓰는 것과 마찬가지로 한 번에 하나의 대상을 실행하는 것이 합리적입니까?
답변1
$targets_array
${targets_array[0]}
필요한 모든 요소를 얻으 려면 ${targets_array[@]}
. 당신은해야올바른 인용.
따라서 다음과 같을 수 있습니다.
parallel … ::: "${targets_array[@]}" # but don't
parallel
외부 명령입니다. 배열이 충분히 크면 argument list too long
. 대신 이것을 사용하십시오:
printf '%s\n' "${targets_array[@]}" | parallel … # still not the best
Bash에 내장되어 있기 때문에 더 잘 작동하므로 printf
이전의 모든 작업은 |
Bash에서 내부적으로 처리됩니다.
나는 당신이 사용하지 않는 것을 알았습니다read -r
(나는 이것이 현명한 결정이라고 생각합니다) 따라서 백슬래시-개행 쌍(있는 경우)은 /location/targets
실제로 일부 배열 요소에서 개행을 생성할 수 있습니다. 따라서 줄 바꿈으로 구분된 데이터를 전달하는 것은 parallel
실수일 수 있습니다 . 널 바이트로 구분됨:
printf '%s\0' "${targets_array[@]}" | parallel -0 …
/location/targets
null 바이트가 포함되지 않기를 바랍니다 . 그렇다면어레이에 도달하지 않습니다.첫 번째.