2013-03-22 6 views
2

나는 손실없이 JPEG 및 PNG 파일을 압축하는 bash는 스크립트를 만드는 오전 아래 bash는 스크립트 명령 병렬화, 그래서 우분투에서이 개 패키지를 사용을 optipng jpegoptim이름. A는 2 또는 4 코어 프로세서와 함께 스크립트를 사용합니다. 내 CPU의 전체 용량을 사용하고 싶습니다.쉘 스크립트 : 우분투 리눅스

문제는 optipng 기본적으로 멀티 스레딩을 지원하지 않는다는 점이다 (단지 하나 개의 CPU 코어를 사용하여), 그래서 결정 I 빠른 이미지를 압축 2 또는 4 병렬 프로세스을 시작. 이미지 파일을 이미 픽셀 수를 기준으로 4 개의 거의 동일한 배열로 정렬 했으므로 병렬 처리 된 프로세스를 실행해야합니다.

명령 끝에 & 문자로 프로세스를 병렬 처리하려고하지만 병렬 작업을 수행하지 않습니다.

optipngout=$(optipng -$pnglevel -dir $outdir ${threaddata_1[@]} &) 
optipngout=$(optipng -$pnglevel -dir $outdir ${threaddata_2[@]} &) 
optipngout=$(optipng -$pnglevel -dir $outdir ${threaddata_3[@]} &) 
optipngout=$(optipng -$pnglevel -dir $outdir ${threaddata_4[@]} &) 

나는 명령의 출력을 잡으려고, 그래서이 문제는 $() 구조라고 생각합니다.

+0

나는 bash는 동시성 지원을하고있다 생각하지 않는다,하지만 난 잘못 될 수 있습니다. 전체 프로그래밍 언어를 사용할 수없는 이유는 무엇입니까? – tjameson

+1

util ['taskset'] (http://linuxcommand.org/man_pages/taskset1.html)은 여러분이 살펴볼 수있는 것입니다. 비록 내가 말을해야하지만, 제한된 사용으로 많은 이점을 실현하지 못했습니다. 또한 "프로세서 유사성"이라는 용어는 검색에 도움이 될 수 있습니다. – jedwards

+0

@jedwards'&'문자로 잘 작동합니다. 당신의 도움을 주셔서 감사합니다! –

답변

3

Gnu parallel을 살펴보십시오. 기존 스크립트를 약간만 수정하면 원하는 작업을 수행 할 수 있습니다.

2

taskset& 명령으로 문제를 해결했습니다. 덕분에 @jedwards

에 대한 최종 코드는 다음과 같습니다

outstr=$(taskset 0xFFFFFFFF optipng -$pnglevel -dir $outdir ${threaddata_1[@]}) & 
outstr=$(taskset 0xFFFFFFFF optipng -$pnglevel -dir $outdir ${threaddata_2[@]}) & 
outstr=$(taskset 0xFFFFFFFF optipng -$pnglevel -dir $outdir ${threaddata_3[@]}) & 
outstr=$(taskset 0xFFFFFFFF optipng -$pnglevel -dir $outdir ${threaddata_4[@]}) &