예 :
PID = 3187 : / home / morganc / test1.out
내 test1.out 파일의 PID 번호와 디렉토리가 나열되도록 find 명령을 어떻게 사용합니까? 위치가 있습니까?
미리 감사합니다.
댓글
답변
두 가지 해결책을 시도 할 수 있습니다.
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를 얻고 단일 경로. 하지만 질문을 어떻게 다르게 해석하고 계신지 알고 있으므로 ' 제 답변에 두 번째 해결책을 추가하여 귀하의 사례를 다루겠습니다. 감사합니다.
find
명령과ps
?