파일이 닫혀 있을 때만 읽기

파일이 닫혀 있을 때만 읽기

파일이 사용 중이 아니거나 다른 프로그램에서 작성된 경우에만 파일을 읽으려면 쉘 스크립트를 작성해야 하는 문제에 직면해 있습니다. lsof를 사용할 수 없습니다. 왜냐하면 스크립트는 매우 기본적인 쉘 기능을 사용하여 QNX를 실행하는 임베디드 하드웨어에서 실행되므로 타사 도구 및 라이브러리가 없기 때문입니다.

답변1

이제 답을 찾은 것 같아요. 스크립트의 일부로 만드세요.

#!/bin/bash
# Script to prevent writing to a certain file.  
# This should be adjusted to your needs, replace all /paths/ and <xxxxxxx> 
# with your true paths and filenames.  
chmod +r /path_to_file/<filename>
<now_do_what_you_want_with_that_file, command(s) here>
for a in {120..1}; do echo -n "$a..." && sleep 1; done    # In 120 seconds <filename> will be writable.
chmod -r /path_to_file/<filename>

파일을 다른 위치로 복사하는 스크립트를 생성한 다음개봉하지도, 사용하지도 않은 사본을 읽으세요., 완료 후 X초 후에 삭제하세요.

필요한 경우 이 작업을 반복할 수 있습니다.

답변2

파일이 현재 작성되고 있는지 여부를 모르고 프로그램이 해당 파일을 사용하고 있는지 확인할 기회가 없다면 ctime, mtime 및 atime을 확인하는 것이 좋습니다. 대부분의 시스템에서 사용할 수 있는 "stat" 명령을 사용하여 이 작업을 수행할 수 있습니다. 3~4번 정도 확인하시고 차이가 없으면 적어주세요. atime(접속 시간)은 확인하는 한 계속해서 변경된다는 점 참고하세요!

또 다른 아이디어는 파일의 복사본을 만들어 해당 복사본을 사용하는 것입니다. 작업이 완료되면 수정본과 원본을 비교하여 다른 변경사항이 없으면 교체합니다. 또한 "diff" 및 "patch"를 사용해 볼 수도 있습니다. 이 작업을 수행하기 전에 백업을 수행하는 것이 좋습니다!

답변3

면책조항: 저는 QNX에 대해 잘 모르고 임베디드 장치에 대해서도 잘 모릅니다.

당신이 묻는 것은 기본적으로 파일 잠금에 관한 것입니다. 프로세스는 일부 작업을 수행하기 위해 잠긴 파일에 대한 공유 잠금(읽기 잠금)을 획득하려고 시도합니다. 다른 프로세스가 동일한 잠금에 대해 배타적 잠금(쓰기 잠금)을 보유하는 경우 첫 번째 프로세스는 배타적 잠금이 해제될 때까지 차단됩니다. 또는 반대로, 다른 프로세스가 이를 공유하는 활성 공유/독점 잠금을 갖고 있지 않은 경우에만 프로세스가 배타적 잠금을 획득할 수 있습니다.

필수적인커널에서 지원해야 하는 파일 잠금. 안정적으로 작동하는 쉘 스크립트를 사용하여 이를 수행하는 Unix 시스템은 거의 없습니다(Linux의 경우이 기사2007년부터 시작하여,이 문제StackOverflow에서).

찾다잠금은 다음과 같은 프로그램을 통해 사용자 공간에서 구현됩니다 flock. 이러한 유형의 파일 잠금에는 다음 프로세스가 필요합니다.협력이는 잠긴 파일에 대한 읽기 또는 쓰기 액세스를 명시적으로 요청해야 함을 의미합니다. 동시에 비협조적인 프로세스는 여전히 잠금 메커니즘을 무시할 수 있습니다.

질문"무리가 작동하지 않는 것 같습니다flock"는 쉘에서 권고 잠금을 사용하는 것에 관한 것입니다 .

또한보십시오:세마포어/잠금으로 사용할 수 있는 Unix 명령은 무엇입니까?mkdir(이는 원자적 작업이기 때문에 일부 답변에서 이 목적으로 사용하는 권고 잠금과도 관련이 있습니다 .)

관련 정보