폴더의 모든 파일을 반복하고 (보통 영구) 명령을 실행하는 작은 스크립트가 있습니다. 원래
for file in ./folder/*;
do
./bin/myProgram $file > ./done/$file
done
(구문 오류는 무시하십시오. 이는 의사 코드일 뿐입니다.)
이제 이 스크립트를 동시에 두 번 실행하고 싶습니다. 분명히 ./done/$file이 존재한다면 실행할 필요가 없습니다. 그래서 스크립트를 다음과 같이 변경했습니다.
for file in ./folder/*;
do
[ -f ./done/$file ] || ./bin/myProgram $file >./done/$file
done
따라서 기본적으로 질문은 다음과 같습니다. 두 개의 스크립트(또는 종종 하나 이상의 스크립트)가 실제로 동일한 지점에 있고 done
실패한 파일이 있는지 확인하고 명령을 두 번 실행하는 것이 가능합니까?
이것은 완벽할 것이지만 나는 그것이 매우 의심스럽습니다. 이것은 매우 쉽습니다 :D 동일한 파일을 처리하는 경우 스크립트를 "동기화"하는 것이 가능합니까?
답변1
가능한 일이고, 실제로 그런 일이 일어나고 있습니다. 사용하다파일 잠금이 상황을 피하기 위해. 위 페이지의 예:
if mkdir /var/lock/mylock; then
echo "Locking succeeded" >&2
else
echo "Lock failed - exit" >&2
exit 1
fi
# ... program code ...
rmdir /var/lock/mylock
답변2
물론 스크립트의 두 인스턴스가 이러한 방식으로 상호 작용하여 명령이 두 번 실행될 수 있습니다. 이것은 ... 불리운다경쟁 조건.
이러한 경쟁 조건을 피하는 한 가지 방법은 각 인스턴스가 입력 파일을 다른 디렉터리로 이동하여 가져오는 것입니다. 동일한 파일 시스템 내에서 파일을 이동하는 것은원자. 입력 파일을 이동하는 것은 이상적이지 않을 수 있으며 이는 약간 복잡해졌습니다.
mkdir staging-$$ making-$$
for input in folder/*; do
name=${x#folder/}
staging=staging-$$/$name
output=making-$$/$name
destination=done/$name
if mv -- "$input" "$staging" 2>/dev/null; then
bin/myProgram "$staging" >"$output"
mv -- "$output" "$destination"
mv -- "$staging" "$input"
fi
done
널리 사용되는 도구를 사용하여 파일을 병렬로 처리하는 간단한 방법은 다음과 같습니다.GNU가 만든다, 사용-j
병렬 실행 플래그. 다음은 이 작업을 위한 makefile입니다(명령을 들여쓰기하려면 탭을 사용하는 것을 기억하세요):
all: $(patsubst folder/%,done/%,$(wildcard folder/*))
done/%: folder/%
./bin/myProgram $< >[email protected]
mv [email protected] $@
make -j 3
3개의 인스턴스를 병렬로 실행하려면 실행하세요 .
당신은 또한 볼 수 있습니다4개의 작업을 동시에 실행하는 중...어떻게 해야 하나요?
답변3
나는 당신이 실제로 여러 작업을 병렬로 실행하려고 시도하고 있으며 파일을 잠그는 것은 단지 목적을 위한 수단일 뿐이라는 느낌을 받았습니다.
GNU 병렬이 있는 경우http://www.gnu.org/software/parallel/설치 후 다음을 수행할 수 있습니다.
parallel ./bin/myProgram ::: ./folder/*
각 코어에서 myProgram을 병렬로 실행합니다.
다음과 같이 간단하게 GNU Parallel을 설치할 수 있습니다.
wget http://git.savannah.gnu.org/cgit/parallel.git/plain/src/parallel
chmod 755 parallel
cp parallel sem
자세히 알아보려면 GNU Parallel 소개 비디오를 시청하세요. https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1
답변4
잠금의 문제점은 중단할 수 없는 잠금(Atomar라고도 함)을 생성하는 방법이 필요하다는 것입니다. Chris가 답변에 쓴 것처럼 mkdir
이것은 논스톱 작업입니다(파일 생성은 그러한 작업이 아닙니다).
고급 명령도 있습니다. 일반적으로 procmail
패키지에 숨겨져 있습니다: lockfile
. 이 명령에는 몇 가지 멋진 기능이 있으며 "바퀴를 다시 만들" 필요 없이(예: 디렉터리를 기반으로 잠금을 생성하는 함수를 직접 작성하는 등) 스크립트에서 쉽게 사용할 수 있습니다.