GNU 병렬 배쉬

GNU 병렬 배쉬

저는 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/targetsnull 바이트가 포함되지 않기를 바랍니다 . 그렇다면어레이에 도달하지 않습니다.첫 번째.

관련 정보