따라서 현재 프로세스에서 사용 중인 삭제된 파일을 보거나 복구하는 것이 가능하다는 것을 알고 있습니다. 나는 이것이 최신 패키지에서도 작동한다는 것을 알았습니다. 따라서 패키지를 업데이트했지만 다른 프로세스에서 여전히 사용 중이고 아직 다시 시작되지 않았기 때문에 이전 버전의 패키지에서 실행된다고 가정해 보겠습니다. 제 질문은 다시 시작되지 않아 이 패키지의 이전 버전에서 어떤 프로세스가 실행되고 있는지 어떻게 확인하는 것입니다.
답변1
공유 라이브러리 inode는 에 등록되어 있습니다 /proc/PID/maps
. 즉, nginx
Fedora 36에서 실행됩니다.
7f9190a00000-7f9190a9a000 r--p 00000000 103:04 794344 /usr/lib64/libstdc++.so.6.0.30
이 파일의 형식에 대한 설명여기.
기본적으로 다섯 번째 필드는 inode 번호입니다. 라이브러리를 업데이트한 후에는 /proc/[0-9]+/maps
각 공유 라이브러리가 실제 파일 시스템 대응물과 일치하는지 확인 해야 합니다 . 실제 파일 inode 번호를 얻으려면 ls --inode /path/file
또는 를 사용할 수 있습니다 stat --printf=%i /path/file
.
다음은 이러한 프로세스를 보여주는 방금 작성한 스크립트입니다.
#! /bin/bash
cd /proc || exit 1
for i in [0-9]*; do
test ! -d $i && continue # PID could have already died
awk '$6 ~ /\// {print $5" "$6}' "$i/maps" | sort -u | while read inode_p so; do
if [ -f "$so" ]; then
inode_r=`stat --format=%i "$so"`
test "$inode_p" != "$inode_r" && echo "PID $i `cat $i/comm` maps stale file '$so'"
fi
done
done
보여주다모두매핑 파일 문제입니다. 공유 라이브러리로만 제한하려면 -f "$so"
으로 바꾸십시오 -e "$so"
.