이 같은:
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-z
find /usr/bin -name less -exec pidof {} \;
~/test.txt
less ~/test.txt
C-z
find ~ -name test.txt -exec fuser {} \;