ps -o pid,ppid,stat,exe -e | grep deleted
다음 출력을 생성합니다.
1777 1346 Sl /usr/bin/python3.10 (deleted)
1778 1346 Sl /usr/bin/python3.10 (deleted)
1825 1327 Ss /usr/lib/bluetooth/obexd (deleted)
2007 1 Sl /usr/bin/python3.10 (deleted)
2101 1346 S /usr/bin/python3.10 (deleted)
2199 1 Sl /usr/bin/python3.10 (deleted)
371565 371305 SLl /usr/lib/x86_64-linux-gnu/webkit2gtk-4.0/WebKitNetworkProcess (deleted)
371566 371305 SLl /usr/lib/x86_64-linux-gnu/webkit2gtk-4.0/WebKitWebProcess (deleted)
376426 371305 SLl /usr/lib/x86_64-linux-gnu/webkit2gtk-4.0/WebKitWebProcess (deleted)
380141 371305 SLl /usr/lib/x86_64-linux-gnu/webkit2gtk-4.0/WebKitWebProcess (deleted)
이것이 (deleted)
의미하는 바는 무엇이며 ps가 경로를 추가하지 않고 나열하도록 하려면 어떻게 해야 합니까?
답변1
Linux ps
에서는 readlink("/proc/<pid>/exe")
.
$ ls -l /proc/self/exe
lrwxrwxrwx 1 chazelas chazelas 0 Dec 17 10:35 /proc/self/exe -> /usr/bin/ls
파일은마법의 심볼릭 링크특정 프로세스(또는 모든 프로세스가 파일을 실행하는 것은 아니므로 상위 프로세스)의 마지막 파일처형된. 파일이 삭제된 경우(패키지 업데이트 후와 같이 새 버전으로 교체된 경우) (deleted)
반환된 문자열에 a 가 추가됩니다 readlink()
. 심볼릭 링크는 여전히 괜찮습니다이미 팔로우 중실제 삭제된 파일에 (그래서마법).
$ cp /bin/sleep .
$ ./sleep 1h &
[1] 17417
$ ls -ld "/proc/$!/exe"
lrwxrwxrwx 1 chazelas chazelas 0 Dec 17 10:38 /proc/17417/exe -> /home/chazelas/sleep*
$ rm sleep
$ ls -ld "/proc/$!/exe"
lrwxrwxrwx 1 chazelas chazelas 0 Dec 17 10:38 /proc/17417/exe -> '/home/chazelas/sleep (deleted)'
새로운 버전 sleep
:
$ cp /bin/sleep .
$ ps -o exe -p "$!"
EXE
/home/chazelas/sleep (deleted)
$ ls -ld "/proc/$!/exe"
lrwxrwxrwx 1 chazelas chazelas 0 Dec 17 10:38 /proc/17417/exe -> '/home/chazelas/sleep (deleted)'
$ ls -iLd "/proc/$!/exe" sleep
3114951 /proc/17417/exe* 3114969 sleep*
-L
ls
아래 링크( 로 대체 stat()
) 를 사용하여 lstat()
해당 i
노드 번호를 얻으세요.
우리는 이것이 두 개의 서로 다른 파일(다른 inode 번호)임을 알 수 있습니다.
$!
삭제된 이전 버전을 계속 실행 중인 경우 sleep
해당 파일에는 마법의 심볼릭 링크 외에는 파일 시스템에 경로가 없습니다 /proc/$!/exe
.
/home/chazelas/sleep
이제는 다른 실행 파일이므로 삭제하면 (deleted)
잘못된 파일을 참조하므로 잘못된 것입니다. 여기서는 exe
마지막 필드이므로 출력을 다음으로 파이프하여 제거할 수 있습니다.
sed 's/ (deleted)$//'
$ ps -o pid,ppid,stat,exe
PID PPID STAT EXE
18928 11196 Ss /usr/bin/zsh
18943 18928 SN /home/chazelas/sleep (deleted)
18967 18928 R+ /usr/bin/ps
$ ps -o pid,ppid,stat,exe | sed 's/ (deleted)$//'
PID PPID STAT EXE
18928 11196 Ss /usr/bin/zsh
18943 18928 SN /home/chazelas/sleep
18968 18928 R+ /usr/bin/ps
18969 18928 S+ /usr/bin/sed
/home/chazelas/sleep
그러나 이는 프로세스 18943이 실행 중인 실행 파일이 아니기 때문에 거짓말일 수 있습니다. sleep
프로세스가 실행된 이후 삭제되었기 때문에 지금은 찾을 수 없는 또 다른 명령입니다.
그리고 /proc/<pid>/exe
파일을 실행하거나 /proc/<pid>/fd/<fd>
일부 fd에서 파일을 열 수 있는 다른 프로세스에 해당하거나 파일에 대한 하드 링크가 있을 수 있습니다.