여러 tar 프로세스가 동시에 동일한 아카이브 파일에 쓰기

여러 tar 프로세스가 동시에 동일한 아카이브 파일에 쓰기

저는 Linux 클러스터에서 많은 작업을 실행하고 있습니다. 각 작업은 여러 개의 출력 파일을 생성합니다. 모든 작업이 완료되면 아카이브 tar cf foo.tar output_files/생성 과 같은 작업을 실행합니다 tar. 수천 개의 파일과 디렉터리가 있으므로 이는 매우 느린 프로세스입니다.

출력 파일을 생성하는 동안 이 작업을 병렬로 수행할 수 있는 방법이 있습니까?

tar여러 프로세스를 여러 시스템에 분산시켜 동시에 동일한 아카이브에 파일을 추가하는 것이 가능합니까 ?

클러스터에는 공유 파일 시스템이 있습니다.

압축을 하면 속도가 더 느려지고 모든 입력 파일 자체가 이미 압축되어 있기 때문에 압축에는 관심이 없습니다. 이상적으로 출력은 파일이지만 tar다른 아카이브 형식도 고려해 보겠습니다.

답변1

동일한 tar 아카이브(또는 압축 여부에 관계없이 다른 일반적인 아카이브 형식)에 여러 프로세스를 추가할 수 없습니다. 각 파일은 연속적으로 저장되며 파일에 데이터를 삽입할 수 없으며 추가하거나 덮어쓰기만 하므로 마지막 파일이 아닌 다른 파일에 계속 쓰면 다음 파일을 덮어쓰게 됩니다.

파일 크기를 미리 알고 있다면 tar 아카이브에 해당 크기를 유지하고 프로그램이 계속 쓰도록 할 수 있습니다. 이를 위해서는 많은 코딩이 필요합니다. 이는 매우 특이한 일입니다.

Unix에는 독립적으로 작성된 파일 세트를 수용하도록 설계된 기능이 있습니다. 디렉토리라고 합니다.

드문 경우지만 디렉토리의 압축되지 않은 아카이브에서 원하는 것을 얻을 수 있습니다. 경우에 따라 읽기 속도가 약간 더 빨라질 수 있습니다. 이는 아카이브 형식(각 파일 항목이 해당 콘텐츠에 대한 포인터임)보다는 디렉터리 형식(각 파일 항목이 해당 콘텐츠에 대한 포인터임)의 고유한 결과입니다. 디렉토리를 조각으로 구성하는 것이 가능해졌습니다. 디렉토리 트리를 아카이브로 변환하는 것은 순차적으로 수행되어야 하는 후처리입니다.

답변2

모든 출력 파일이 생성되기 전에 최종 파일 생성을 시작할 수 있습니다 tar. 이렇게 하면 원하는 속도를 얻을 수 있을 것입니다.

다음과 같이 tar를 호출할 수 있습니다.

tar -cf foo.tar -T file-list

file-listFIFO가 될 것입니다. 감지하려면 스크립트가 필요합니다.

  1. 소스 디렉터리의 새 파일( inotifywatch)

  2. 각각의 새 파일이 완료되면 ( fuser)

파일이 완료되면 해당 경로가 FIFO에 기록됩니다. 경로가 완전히 혼합된 아카이브를 생성하지 않는 것이 유용할 수도 있습니다. 첫 번째 입력 파일의 디렉터리를 가져오는 것으로 시작하고 마지막 파일이 완료된 후에만 새 디렉터리를 추가할 수 있습니다(해당 프로세스가 완료된 후 플래그 파일 생성). 첫 번째 접근 방식의 장점은 파일 전체가 캐시에 있을 수 있다는 것입니다.

답변3

GNU tar에는 --append가 있습니다:

tar -f foo.tar --append newfiles

불행히도 전체 tar 파일을 읽습니다.

관련 정보