2013-05-11 5 views
2

OSX에서 실행되는 bash 스크립트가 있습니다.
네트워크 공유 (Synology NAS의 AFP 공유)에서 일부 파일을 조작해야합니다.OSX에서 Bash : 네트워크 파일 (AFP)이 사용 중인지 확인하는 방법은 무엇입니까?

불행히도 이러한 파일은 스크립트가 실행될 때 작성되는 경우가 있습니다.

파일의 사용 여부는 어떻게 결정합니까?

정상적인 방법은 "lsof"를 사용하는 것이지만 다른 사용자가 LAN의 다른 클라이언트에서 오는 경우 네트워크 파일에서 작동하지 않는 것 같습니다.

파일의 이름을 바꿀 수 있습니다. 파일이 사용 중이면 오류가 발생한다고 생각합니다.하지만 그다지 우아하지 않습니다.

아무도 더 좋은 해결책이 있습니까?

+0

[Apple Discussions] (https://discussions.apple.com/thread/3252589?start=0&tstart=0) 스레드 도움말에있는 내용이 도움이됩니까? – summea

+0

및 동시 액세스 네트워크 공유 파일에 대한이 토론은 일반적으로 http://serverfault.com/questions/61086/concurrent-nfs-access –

+0

@summea 해당 스레드는 공유를 호스팅하는 서버의 관점에서 사물을 설명합니다. 나는 클라이언트 측에있다. – Tonny

답변

3

일반적으로 해결할 수있는 문제는 아닙니다. 일반적인 해결책은 파일을 임시 위치에 기록한 다음 파일을 최종 처리 디렉토리로 이동하는 것입니다 (파일 시스템 내에서의 이동은 일반적으로 원자 적입니다). 파일을 작성하는 방법이나 위치를 제어 할 수없는 경우, 특히 파일을보고 "잠시"성장하지 않았는지 확인하는 것과 같은 일을하는 경험적 방법으로 남겨 둡니다. 그러나 이들 중 어느 것도 분리와 비교할 때 특히 좋습니다 enqueuing에서 쓰기.

+0

나는 이미 그 결론에 도달했다. 내가 뭔가를 놓쳤는지를보기 위해 여기에 올렸지 만 분명히 아닙니다. 그래서 나는 파일의 이름을 먼저 바꾸고 (당신이 말하는 원자 연산) 이름을 바꾼 파일로 작업을 시도 할 것이다. 추가적인 이점은 이름 바꾸기에서 파일 이름에 공백을 제거 할 수 있다는 것입니다. 스크립트의 나머지 부분을 훨씬 쉽게 만듭니다. 공백이있는 악몽이 될 것입니다. – Tonny

+0

공백은 파일 이름에서 유일한 위험한 문자로부터 * 멀리 떨어져 있습니다. 스크립트에서 적절한 인용을해야합니다. 주변을 둘러 볼 필요가 없습니다. –

+0

@KenThomases 알아. 나를 믿어 라. 다행히 나를 위해 모든 파일의 기원은 Windows 나 OSX 다. 그래서 가장 위험한 것들은 이미 OS에 의해 허용되지 않습니다. 무언가가 끝나면 이름 바꾸기가 오류를 일으키고 파일을 건너 뛰게됩니다. 이것으로 충분합니다. 스크립트로 작성된 로그 파일은 어쨌든 운영자에 의해 점검되고 문제의 경우 수동으로 처리 할 수 ​​있습니다. – Tonny

1

다른 잠재적 인 액세스가 임의의 프로그램에서 수행되고 있습니까? 아니면 다른 클라이언트에서 실행중인 다른 프로그램 인스턴스에서 처리되고 있다고 가정 할 수 있습니까?

파일이 프로그램에 비공개이면 프로그램의 모든 인스턴스가 협업 잠금 구성표에 참여할 수 있습니다. 예를 들어 lockfile 명령을 사용할 수 있습니다. 신호/예외 상황에서도 잠금 파일을 정리해야합니다. trap 기본 제공 명령을 사용하여 도움을받을 수 있습니다. 자세한 내용은 here을 참조하십시오.

+0

그럴 수 있으면 좋겠다. 파일은 다양한 업로드 수단 (ftp, scp, rsync)으로 생성됩니다. 내 스크립트는 한 번 읽으면 다른 형식으로 변환 한 다음 (변환이 성공한 경우) 원본을 보관 위치로 이동해야합니다. 파일에 읽기 잠금 만있는 경우 변환이 성공하고 (오류없이) 파일이 아직 완전히 업로드되지 않은 경우 출력이 깨집니다 (따라서 쓸모가 없습니다). 그리고 그 조건을 감지 할 방법이 없습니다. – Tonny