파일이 사용 중인지 확인하는 더 빠른 방법이 있습니까?

파일이 사용 중인지 확인하는 더 빠른 방법이 있습니까?

파일이 열려 있거나 무언가에 의해 사용 중인지 알려주는 명령줄 함수 또는 c 함수를 찾고 있습니다.

lsof하지만 fuser그들은 일부 상황에서 최대 300ms가 소요되는 많은 다른 정보를 제공합니다(예: MAC OS X에서 이 코드를 사용할 때, 저는 Linux 및 OS X용으로 개발 중입니다). 5ms가 걸리는 솔루션이므로 Unix에서도 매우 빠르고 파일이 사용 중인 경우 true 또는 false를 반환하는 항목을 찾으려고 합니다.)

답변1

이것을 잠금으로 사용하는 경우 둘 다 작동하지 않거나 lsof경쟁 fuser조건을 방지하지 않습니다.

기본 프로세스는 열려 있는 파일 설명자를 찾는 lsof모든 프로세스를 탐색하는 것입니다 . /proc/*/fs무엇을 하든 시간이 걸릴 것입니다.

이 작업은 직접 수행할 수 있지만 시스템에 열려 있는 모든 프로세스를 확인해야 하므로 속도가 더 빨라질 가능성은 없습니다.

지금 하고 있는 일이 시간이 중요한 경우에는 다른 방법을 찾아보세요.

  • 자신이 작성한 프로그램을 통해 파일을 제어하는 ​​경우; 잠금 파일을 사용하십시오.
  • 파일에 대해 작동하는 일부 명령을 실행하는 경우 해당 명령/프로그램이 제공하는 문서가 무엇인지 살펴보고 잠금 파일을 만들 수 없는지 확인하십시오. 실패하면 PID가 포함된 파일을 만들 수 없는지 확인하세요. 그런 다음 /proc/<PID>/fs파일이 현재 열려 있는지 확인할 수 있습니다 . 하나의 프로세스 열린 파일 설명자만 보는 것이 모든 프로세스에 걸쳐 매핑하는 것보다 훨씬 빠릅니다.
  • 그렇지 않으면 당신을 돕기 위해 당신이 하고 있는 일에 대한 추가 정보가 필요할 것입니다.

Firefox가 특정 시스템에서 실행되고 있는지 확인하려는 의견에 더 많은 정보를 제공했습니다. 이를 수행하는 가장 좋은 방법은 Firefox의 잠금 파일을 찾는 것입니다. 이것들은 다음 위치에 저장됩니다.기본 위치Mozilla 위키에 지정되어 있습니다.

예를 들어, Linux에서는 프로그램이 다음을 수행하도록 합니다.

  • 디렉토리 를 열어보세요 ~/.mozilla/firefox/.
  • 로 끝나는 디렉토리를 필터링하여 모든 디렉토리를 나열합니다 .default. ( .default모든 디렉토리로 크롤링하는 것이 아니라면 모든 프로필이 로 끝나는 것 같습니다 .)
  • lock위의 각 디렉터리에서 또는 이라는 파일이 있는지 찾아보세요 .parentlock. 하나 또는 두 파일이 모두 보이면 Firefox가 열려 있는 것입니다.

이 알고리즘은 현재 Windows에서 수행하는 것보다 더 빠르게 실행되어야 합니다.

답변2

TL;DR

~ 안에당신의 댓글 중 하나, 귀하는 다음과 같이 말합니다.

내 정확한 상황은 다음과 같습니다. 파일 경로가 있습니다. Firefox가 실행 중이면 잠겨 있습니다. 잠겨 있는지 확인하고 Firefox가 실행 중인지 확인하고 싶습니다.

잠금 파일에 대한 귀하의 원래 질문은 Firefox가 특정 사용자에 대해 실행 중인지 확인하고 프로세스 상태를 검사하는 더 쉬운 방법이 있을 때 먼 길처럼 보입니다.

프로세스 상태 검사

주어진 프로세스의 PID를 찾는 더 합리적인 방법은 다음을 사용하는 것입니다.pgrep~로부터소품패키지. 예를 들어:

$ pgrep -u $LOGNAME firefox
5671

그런 다음 다음을 사용하여 PID 상태를 검사할 수 있습니다.추신:

$ ps 5671
  PID TTY      STAT   TIME COMMAND
 5671 ?        Sl   105:47 /usr/lib/firefox/firefox

아니면 다른 어떤 방해물도 없이 그냥 주 깃발을 얻으세요:

$ ps -ho stat $(pgrep -u $LOGNAME firefox)
Sl

내 시스템 중 하나인 위의 한 줄짜리 시스템은 완료하는 데 지속적으로 1.4밀리초밖에 걸리지 않습니다. 귀하의 마일리지가 다를 수 있습니다.

프로세스 상태 코드

ps(1)의 PROCESS STATE CODES 섹션에서는 다양한 상태 플래그의 의미를 자세히 설명합니다. Ubuntu 14.04의 매뉴얼 페이지에는 다음과 같이 나와 있습니다.

PROCESS STATE CODES
       Here are the different values that the s, stat and state output
       specifiers (header "STAT" or "S") will display to describe the state of
       a process:

               D    uninterruptible sleep (usually IO)
               R    running or runnable (on run queue)
               S    interruptible sleep (waiting for an event to complete)
               T    stopped, either by a job control signal or because it is
                    being traced
               W    paging (not valid since the 2.6.xx kernel)
               X    dead (should never be seen)
               Z    defunct ("zombie") process, terminated but not reaped by
                    its parent

       For BSD formats and when the stat keyword is used, additional
       characters may be displayed:

               <    high-priority (not nice to other users)
               N    low-priority (nice to other users)
               L    has pages locked into memory (for real-time and custom IO)
               s    is a session leader
               l    is multi-threaded (using CLONE_THREAD, like NPTL pthreads
                    do)
               +    is in the foreground process group

관련 정보