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


8

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

lsof그리고 fuser이 얘기 할 수 있지만, 그들이 어떤 상황에서이 300ms까지 복용의 결과는 (i MAC OS X에이 코드를 사용할 때처럼, 나는 리눅스와 OS X에 대한 devving있어) 다른 많은 정보를 제공하는 (나는 창문이 5ms가 걸리는 솔루션이므로 Unix에서 매우 빠르며 파일을 사용하는 경우 true 또는 false를 반환합니다.)


답변:


9

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

기본적인 프로세스는 열린 파일 디스크립터를 찾는 lsof모든 프로세스를 /proc/*/fs탐색하는 것입니다. 당신이 무엇을하든 시간이 걸릴 것입니다.

이 작업을 직접 수행 할 수 있지만 시스템에서 열려있는 모든 프로세스를 확인해야하기 때문에 속도가 더 빠를 수는 없습니다.

당신이하고있는 일이 시간이 중요하다면, 다른 방법을 찾으십시오.

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

주어진 시스템에서 Firefox가 실행 중인지 확인하려는 설명에 추가 정보를 제공했습니다. 가장 좋은 방법은 Firefox의 잠금 파일을 찾는 것입니다. 이들은 Mozilla 위키에 지정된 기본 위치에 저장됩니다 .

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

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

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


훌륭한 답변 감사합니다. python 폴더가 firefox 인 경우 lsof 및 fuser에게 pid 폴더 만 검사하도록 지시합니까? 파이어 폭스 폴더를 제외한 폴더의 모든 내용을 건너 뛸 수 있습니다 (3 개의 별도 인스턴스가 있으므로 3 개의 폴더를 올바르게 검사한다는 의미입니까?)
Noitidart

파일이 잠겨 있지만 파일이 잠겨 있는지 테스트하는 방법을 알 수 없습니다. 읽기 / 쓰기를 위해 성공적으로 열리고 있습니다. 너무 이상하다. 나는 C에서 fcntl을 시도하지만 항상 반환 -1 :(
Noitidart

3
@Noitidart 당신이 해결하려는 실제 문제는 무엇입니까? 프로세스의 열린 파일 디스크립터를 찾으려면 PID를 알아야합니다. 이것은 프로그램의 각 인스턴스마다 변경됩니다. "수동으로"얻는 간단한 방법은입니다 ps aux firefox. 해당 PID를 가져 와서 /proc/파일 시스템 에서 찾아보십시오 .
nixeagle

아에 대한 좋은 생각 ps aux firefox입니다. 내 정확한 상황은 다음과 같습니다. 파일 경로가 있습니다. 파이어 폭스가 실행 중이면 잠 깁니다. Firefox가 실행 중인지 여부를 확인하고 싶습니다.
Noitidart

1
@Noitidart 잠금 파일을보고 파이어 폭스를 감지하는 방법을 포함하도록 내 의견을 편집했습니다. 모든 시스템에서이 프로세스를 반복 할 수 있습니다.
nixeagle

1

TL; DR

에서 귀하의 의견 중 하나 , 당신은 상태 :

내 정확한 상황은 다음과 같습니다. 파일 경로가 있습니다. 파이어 폭스가 실행 중이면 잠 깁니다. Firefox가 실행 중인지 여부를 확인하고 싶습니다.

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

검사 과정 상태

주어진 프로세스의 PID를 찾는 더 합리적인 방법 은 procps 패키지 에서 pgrep 을 사용 하는 것 입니다. 예를 들면 다음과 같습니다.

$ pgrep -u $LOGNAME firefox
5671

그런 다음 ps 를 사용하여 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

1
문제는 그가 파이어 폭스가 어떤 세션에 있는지 알아야한다는 것입니다 ~/.mozilla/firefox/*/lock. 리눅스에서는을 찾으면됩니다 . 그런 다음 각 잠금 파일의 상위 디렉토리 이름을보고 세션을 식별 할 수 있습니다. 다른 플랫폼에서는 작동하지 않습니다. 우리의 채팅은 Mac에서 작동시키는 방법에 대해 더 자세히 설명합니다 (우분투와 관련이 없지만 거기에 있습니다). 공정하게 말하면 그는 질문을 좀 더 구체적으로 업데이트해야합니다. : P
nixeagle
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.