이것은 가상의 시나리오입니다. 인터넷을 통해 파일/폴더를 수신하는 프로세스에 의해 동기화되는 특정 폴더가 있다고 가정해 보겠습니다. 이제 이 작업이 진행되는 동안 해당 디렉터리는 동기화를 위해 cp'd되어서는 안 됩니다. 어쨌든 이것이 가능합니까?
답변1
적어도 두 가지 가능한 해결책이 있습니다:
- 프로세스가 실행 중인지 또는 잠긴 파일을 테스트하여 동기화가 실행 중인지 확인한 다음 작업을 중단하거나 지연시키는 cp용 래퍼 스크립트를 만듭니다.
LD_PRELOAD
전화 끊기write
및 기타 통화 에 사용됩니다 .
첫 번째 해결 방법의 문제점은 , , , , mv
...와 같이 폴더에 쓰기 위해 모든 명령을 래핑해야 한다는 것입니다. 반면에 이 방법은 매우 간단하지만 현재 사용자에게만 작동합니다.cp
rsync
rm
ln
cat
두 번째 해결 방법의 경우 디렉터리 변경/수정 을 위한 모든 시스템 호출을 포함하는 공유 라이브러리를 작성해야 합니다 write
. 하지만 이 솔루션은 동적으로 연결된 모든 실행 파일에 적용되므로 다른 모든 항목을 조정할 필요가 없습니다.unlink
rename
답변2
동기화 프로세스가 실행 중이고 가능한 유일한 작업이 이라는 것을 알고 있는 경우 모든 프로세스에 메시지를 보내 실행을 일시 중지 cp
할 수 있습니다 . SIGSTOP
동기화가 완료되면 SIGCONT
모든 프로세스를 보내 계속 진행합니다.
이렇게 하려면 kill -s SIGSTOP $(pidof cp)
또는 를 사용할 수 있습니다 killall -s SIGSTOP cp
. 터미널에서는 Ctrl+를 사용하여 Z작업을 백그라운드("일시 중지")로 전환할 수 있습니다. 실행을 계속하려면 fg
명령("foreground", 참조 help fg
)을 사용하십시오.
답변3
동기화 장치가 디렉터리를 읽는 대신 디렉터리에 쓰고 있습니다. 맞나요? 따라서 파일 시스템 스냅샷을 찍거나 변경할 수 없는 비트를 설정하는 것은 더 이상 사용되지 않습니다.
동기화 장치를 루트로 실행하는 경우 디렉터리의 소유권을 루트로, 권한을 700(rwx------; 소유자만 무엇이든 할 수 있음)으로 변경할 수 있습니다. 이렇게 하면 루트로 실행되지 않는 모든 새 프로세스가 차단되지만 파일이나 하위 디렉터리가 열려 있는 모든 프로세스는 계속 변경할 수 있습니다.
Linux에서는 현재 파일이 열려 있는 트리에서 모든 프로세스를 찾으려면 다음을 수행할 수 있습니다 lsof +D my_directory
. 그러나 이 지식을 바탕으로 수행하는 작업은 특정 상황에 따라 다릅니다.