Linux에서 파일이 열려있는 프로세스를 어떻게 확인할 수 있습니까?


124

잠금 파일에 대한 소유권이있는 프로세스를 결정하고 싶습니다. 잠금 파일은 작성된 특정 이름을 가진 파일입니다.

그렇다면 Linux에서 특정 파일이 열려있는 프로세스를 어떻게 확인할 수 있습니까? 바람직하게는 하나의 라이너 유형 또는 특정 Linux 도구 솔루션이 최적입니다.

답변:


55

fuser이것을 위해 사용할 수도 있습니다 :

~> less .vimrc
# put in background
~> fuser .vimrc
.vimrc:              28135
~> ps 28135
  PID TTY      STAT   TIME COMMAND
28135 pts/36   T      0:00 less .vimrc

이것은 훌륭했지만 스크립트에서 사용하려면 출력 길이를 확인해야했습니다.
— chovy

출력 길이는 무엇을 의미합니까?
— Nathan Fellman

if [ 퓨저 "$ file"`]; 그런 다음 종료`
— chovy

1
퓨저가 종료 코드와 이상한 동작을합니다. A / 일부 내부 오류, 확인 된 파일을 찾을 수 없음 등, B / 프로세스가 지정된 파일을 열지 않은 상태로 종료 코드 1 개를 리턴합니다. 상황 A / 일부 오류 메시지가 출력으로 인쇄됩니다. 불행히도 파일이 사용 가능하고 무언가에 의해 열리면 출력이 생성되지만 종료 코드는 0입니다. 퓨저가 현재와 같이 두 개가 아닌 세 개의 코드로 종료하는 것이 좋습니다. lsoft는 좀 느리게 작동하기 때문에 약간 더 나쁘게 해결됩니다.
— Znik

이는 본질적으로 ls다음과 같은 패턴입니다 . 오류 (예 : 유효하지 않은 옵션이 지정됨) 또는 파일을 찾을 수 없으면 (종료 정보를보고하면 0 ) 종료 코드 2를 리턴합니다 .
— Scott

144

대부분의 Linux 시스템에서 lsof NAME다음 작업을 수행합니다.

fin@r2d2:~$ lsof /home/fin
COMMAND   PID USER   FD   TYPE DEVICE SIZE    NODE NAME
bash    21310  fin  cwd    DIR    8,1 4096 5054467 /home/fin
lsof    21320  fin  cwd    DIR    8,1 4096 5054467 /home/fin
lsof    21321  fin  cwd    DIR    8,1 4096 5054467 /home/fin
fin@r2d2:~$

4
lsof가 없으면 어떻게해야합니까?
— JoseLSegura

3
@ Joosesegura : 나는 당신이 대답 '그런 다음 lsof'를 쓸모가 없을만큼 충분한 자원이 있다고 가정합니다. 문제에 대해 자세히 설명해 주시겠습니까? 루트가 없으면 다른 사용자가 파일을 열어 놓았는지 확인할 권한이 없을 것입니다.
— Michael Scheper

이것은 파일에 대해서만 작동하지 않는 것 같으며 dirs에 대해서만
— Jason

@Jason : 파일에서 작동하지만 cwd라인 (프로세스의 현재 작업 디렉토리로 사용하는 보고서)은 디렉토리 만보고합니다 .
— reinierpost

9

각 프로세스가 먼저 파일이 열려 있는지 확인하고 파일이 열려 있거나 진행되지 않은 경우 파일을 만들거나 열지 않아야하는 경우 두 프로세스가 동시에 잘 확인할 수 있기 때문에 파일을 여는 것은 잠금이 아닙니다. 열려 있지 않다면, 생성하거나여십시오.

파일을 잠금으로 사용하려면 점검 및 잠금 조작은 단일 인터럽트 불가능 조작이어야합니다. 읽기 전용 모드로 파일을 작성하고 잠금을 해제하기 위해 파일을 제거하여 Unix 파일 시스템에서이를 달성 할 수 있습니다. 파일이 존재하고 (읽기 전용 인 경우) 파일 작성에 실패하므로 단일 원자 조작으로 점검 및 잠금을 얻을 수 있습니다.

잠금 프로세스가 데몬으로 실행되는 쉘 스크립트 umask인 경우 새 파일이 작성되는 권한을 설정하는 프로세스 별 설정을 사용하여이 효과를 얻을 수 있습니다 .

oldumask = $ (umask)
umask 222 # 소유자도 쓸 수없는 파일 만들기
echo $$> / var / lock / foo 인 경우
그때
    : 잠금 성공
그밖에
    : 잠금 실패
fi
umask $ oldumask
또한 소유 프로세스의 PID를 파일에 기록하여 다른 문제를 해결합니다. cat /var/lock/foo
"어떤 프로세스에서이 파일을 열었습니까?"라는 특정 질문과 관련하여 파일 시스템을 마운트 해제하려고 할 때 유용 할 수 있지만 일부 프로세스에서 파일을 열었 기 때문에 사용할 수 없습니다. 해당 명령을 사용할 수없는 경우 /proc루트로 요청할 수 있습니다 .

ls -l /proc/*/cwd | grep '/var/lock/foo$'

또는 필사자로서 :

ls -l /proc/*/cwd 2>/dev/null | grep '/var/lock/foo$'


`ls -l '메소드는 Linux에서는 작동하지만 CygWin에서는 작동하지 않는 것 같습니다. 파일 잠금에 대한 정보는 없습니다. 해결 방법을 모르십니까? 감사.
— Sopalajo de Arrierez

아니요, 잠금을 위해 읽기 전용 파일을 만들지 않습니다. 앱이 중단 될 때 파일이 여전히 존재하기 때문입니다. 충돌 한 앱이 마음에 든 후에 사용자가 쓰레기를 치우도록 강요합니다.
— polkovnikov.ph

6

당신이없이 파일에 정확히 어떤 프로세스의 파일 기술자 링크를 알고 싶은 경우 lsof또는 fuser-를 통해 검색 /proc:

$ find /proc -regex '\/proc\/[0-9]+\/fd\/.*' -type l -lname "*$1*" -printf "%p -> %l\n" 2> /dev/null

대체 $1당신이 찾고있는 열려있는 파일 이름으로. -printf보고 싶은 모든 것을 수정 하거나 해당 프로세스 정보 egrep -o '[0-9]+' | head -1와 함께 사용할 수 있습니다 .ps -Fp <pid>

@fin 의 대답은 분명히 가장 좋은 대답이지만 @JoseLSegura의 의견 에 대답하는 것이 가능하지 않은 경우 위의 해결책은 내 대답이었습니다.$ lsof <filename>


2

수락 된 답변을 사용하면 내 디렉토리 (ubuntu 14.04)를 사용하고있는 프로세스가 나열되지 않습니다.

결국 lsof (열린 파일 목록)를 사용하고 문제를 일으키는 프로세스를 찾기 위해 출력을 grepp했습니다.

lsof | egrep "<regexp-for-your-file>"

이를보다 깨끗하고 빠르게 사용하는 방법 lsof은 옵션 -R입니다. 예 : lsof -R [filename]
— tron5
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.