예 :

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

내 test1.out 파일의 PID 번호와 디렉토리가 나열되도록 find 명령을 어떻게 사용합니까? 위치가 있습니까?

미리 감사합니다.

댓글

  • 혼동하지 않으시겠습니까 find 명령과 ps?
  • 파일을 만들었거나 열어 놓은 프로세스가 아직 실행 중이면 Gilles 응답이 작동합니다. 파일을 생성 한 프로세스가 더 이상 실행되지 않고 과거에 무슨 일이 있었는지 확인할 방법이 없습니다.
  • 파일이 어떻게 PID를 얻었습니까?

답변

두 가지 해결책을 시도 할 수 있습니다.

fuser /path/to/opened/file 

또는

lsof /path/to/opened/file 

Answer

파일을 생성했거나 열어 놓은 프로세스의 소유자 인 경우 당신

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 파일이 열려 있고 전체 경로는

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

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로 파이프하여 이전 줄을 저장하고 현재 줄이

:

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 

답변

다름 질문을 해석하는 방법 (댓글 참조)에 따라 솔루션은 다음 중 하나입니다.

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

또는 :

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

$root_dir 변수를 원하는 시작 디렉토리로 정의하는 위치 검색을 수행하고 $file_name를 찾고있는 파일의 이름으로합니다.

실행 파일을 검색하는 경우 첫 번째 대안 두 번째 대안은 데이터 파일이 실행 파일에 의해 실행되는 경우입니다.

이를 테스트하기 위해 (첫 번째 대안) 명령을 사용하고 C-z를 눌러 중지하고 백그라운드에 배치하고 find /usr/bin -name less -exec pidof {} \;를 실행했습니다. 두 번째 대안을 테스트하기 위해 데이터 파일 ~/test.txt을 만들고 less ~/test.txt를 실행 한 다음 C-z 다음에 find ~ -name test.txt -exec fuser {} \;가 표시됩니다.

댓글

  • 20 명이

? 나는 OP가 출력 파일 이름을 찾고 싶어한다고 생각합니다.

  • 나는 질문이 데이터 파일이 아닌 실행 파일 사용에 대한 검색이라는 것을 이해 했으므로 귀하의 경우 그는 20 개의 pid를 얻고 단일 경로. 하지만 질문을 어떻게 다르게 해석하고 계신지 알고 있으므로 ' 제 답변에 두 번째 해결책을 추가하여 귀하의 사례를 다루겠습니다. 감사합니다.
  • 답글 남기기

    이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다