ps -o pid,ppid,stat,exe -e | ps -o pid,ppid,stat,exe -e | grep delete 실행 파일 경로에 "(제거됨)"이 추가됨

ps -o pid,ppid,stat,exe -e | ps -o pid,ppid,stat,exe -e | grep delete 실행 파일 경로에 "(제거됨)"이 추가됨
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에서 파일을 열 수 있는 다른 프로세스에 해당하거나 파일에 대한 하드 링크가 있을 수 있습니다.

답변2

당신의메모명령, 사용exe실행 파일 경로를 인쇄하기 위한 인수를 요청했습니다.

man proc이 영역을 자세히 소개합니다.

경로 이름의 링크가 해제되면 심볼릭 링크에는 원래 경로 이름에 "(삭제됨)" 문자열이 추가됩니다.

이것은 옵션이 아니며(경로 표시를 요청할 때) 반드시 경로를 표시해야 하기 때문에 제가 생각할 수 있는 유일한 해결책은 결과를 후처리하는 것입니다. 예를 들어 sed를 사용하면 다음과 같습니다.

ps -o pid,ppid,stat,exe -e | sed "s/(deleted)//g"

관련 정보