find 명령을 사용하여 파일의 PID와 해당 위치를 얻는 방법은 무엇입니까?

find 명령을 사용하여 파일의 PID와 해당 위치를 얻는 방법은 무엇입니까?

이 같은:

PID=3187:/home/morganc/test1.out

test1.out 파일의 PID 번호와 해당 파일이 위치한 디렉터리를 나열하기 위해 find 명령을 사용하는 방법은 무엇입니까?

미리 감사드립니다.

답변1

파일을 생성하거나 연 프로세스의 소유자인 경우 다음을 수행할 수 있습니다.

ls -o /proc/*/fd 2> /dev/null

그러면 사용자 ID의 PID에 대한 모든 파일이 나열됩니다. 실행 중인 프로세스가 많지 않은 경우 출력을 수동으로 확인하세요. 예: vmstat.out열려 있는 프로세스 찾기:

mark (/home/mark)> ls -l /proc/*/fd 2> /dev/null
/proc/27669/fd:
total 0
lrwx------. 1 mark mark 64 Feb 13 19:51 0 -> /dev/pts/0
lrwx------. 1 mark mark 64 Feb 13 19:51 1 -> /dev/pts/0
lrwx------. 1 mark mark 64 Feb 13 19:53 10 -> /dev/pts/0
lr-x------. 1 mark mark 64 Feb 13 19:53 12 -> /home/mark
l-wx------. 1 mark mark 64 Feb 13 19:51 2 -> /dev/null
lrwx------. 1 mark mark 64 Feb 13 19:53 4 -> /home/mark/.sh_history

/proc/27737/fd:
total 0
lrwx------. 1 mark mark 64 Feb 13 19:53 0 -> /dev/pts/0
lrwx------. 1 mark mark 64 Feb 13 19:53 1 -> /dev/pts/0
lrwx------. 1 mark mark 64 Feb 13 19:53 2 -> /dev/pts/0
lr-x------. 1 mark mark 64 Feb 13 19:53 3 -> /home/oracle/log/vmstat.out
lr-x------. 1 mark mark 64 Feb 13 19:53 4 -> anon_inode:inotify

그래서 PID가 27737파일을 열었고 vmstat.out전체 경로는 다음과 같습니다./home/oracle/log/vmstat.out

대부분의 출력을 필터링하려면 다음을 시도하십시오.

mark (/home/oracle/log)> ls -l /proc/*/fd 2> /dev/null | grep -E '(^/proc|vmstat.out)'
/proc/27669/fd:
/proc/27943/fd:
lr-x------. 1 mark mark 64 Feb 13 20:00 3 -> /home/oracle/log/vmstat.out
/proc/28047/fd:
/proc/28048/fd:
/proc/self/fd:
mark (/home/oracle/log)>

그런 다음 관심 있는 파일 위에서 PID를 찾으십시오.

따라서 다른 프로세스를 무시하기 위해 awk로 파이프하고 이전 줄을 저장한 다음 현재 줄이 다음으로 시작하는 것을 발견하면 이전 줄을 인쇄합니다 l.

ls -l /proc/*/fd 2> /dev/null | \
  grep -E '(^/proc|vmstat.out)'  | \
  awk 'BEGIN { prev = $0} /proc/ { prev = $0 } /^l/ { print prev  $NF }'

/proc/27943/fd:/home/oracle/log/vmstat.out

답변2

시도해 볼 수 있는 두 가지 해결 방법은 다음과 같습니다.

fuser /path/to/opened/file

또는

lsof /path/to/opened/file

답변3

문제를 어떻게 해석하는지(댓글 참조)에 따라 해결책은 다음과 같습니다.

find $root_dir -name $file_name -exec pidof {} \;

또는:

find $root_dir -name $file_name -exec fuser {} \;

$root_dir검색을 수행할 시작 디렉터리와 $file_name찾을 파일 이름 으로 변수를 정의할 수 있습니다 .

첫 번째 옵션은 실행 중인 실행 파일을 검색할 때 적합하고, 두 번째 옵션은 실행 파일로 데이터 파일을 실행할 때 적합합니다.

이것을 테스트하기 위해(첫 번째 대안의 경우) 명령을 사용하여 파일을 열고 이를 중지하고 백그라운드에 넣은 다음 실행했습니다 less. 두 번째 옵션을 테스트하기 위해 데이터 파일을 생성했습니다 . 먼저 실행 한 다음 실행하고 마지막으로 .C-zfind /usr/bin -name less -exec pidof {} \;~/test.txtless ~/test.txtC-zfind ~ -name test.txt -exec fuser {} \;

관련 정보