어쨌든 cp 프로세스를 실패/지연시키려면?

어쨌든 cp 프로세스를 실패/지연시키려면?

이것은 가상의 시나리오입니다. 인터넷을 통해 파일/폴더를 수신하는 프로세스에 의해 동기화되는 특정 폴더가 있다고 가정해 보겠습니다. 이제 이 작업이 진행되는 동안 동기화 장치를 위해 해당 디렉터리에 대한 cp 작업이 없어야 합니다. 어쨌든 이것이 달성될 수 있습니까?

답변1

적어도 두 가지 가능한 해결책이 있습니다:

  1. 프로세스가 실행 중인지 확인하거나 잠금 파일을 테스트하여 동기화가 실행 중인지 확인하고 작업을 중단하거나 지연시키는 cp용 래퍼 스크립트를 만듭니다.
  2. LD_PRELOAD연결 write및 기타 통화 에 사용합니다 .

mv첫 번째 해결 방법의 문제점은 폴더에 쓰는 데 사용되는 모든 명령(예 : cp, rsync, rm, ln, ...) 을 래핑해야 한다는 것입니다. cat반면에 이 방법은 매우 간단하지만 현재 사용자에게만 작동합니다.

write두 번째 해결책의 경우 디렉토리를 변경/수정하는 데 사용되는 모든 syscall(예 : , 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. 하지만 그 지식으로 무엇을 할지는 상황에 따라 다릅니다.

관련 정보