프로그램의 PID를 알고 있으면 실행 중인 프로그램의 실행 파일을 나열하고 싶습니다.
내가 읽을 수 있는 바이너리 프로그램의 경우 /proc/$pid/exe
실행 파일에 대한 심볼릭 링크입니다.
그러나 스크립트 프로그램(예: Python 프로그램)의 경우 프로그램 자체가 /proc/$pid/exe
중요 하지 않습니다. 이는 내가 launcher 를 /usr/bin/python
사용하든 사용하든 상관없이 발생합니다 ../program.py
python program.py
나는 그것을 해결하기 위해 여러 가지 방법을 시도했습니다.
/proc/$pid/cmdline
스크립트의 파일 이름이 포함되어 있지만 상대 경로에 있으므로 작업 디렉터리가 변경되었을 수 있습니다.
저도 시도해봤는데 /proc/$pid/comm
프로그램을 통해 쉽게 바꿀 수 있어요.
그렇다면 실행 중인 프로그램의 원본 스크립트 파일을 어떻게 알 수 있습니까?
답변1
디스크의 파일이 변경되지 않았고(적어도 동일한 이름을 가진 파일이 추가되거나 제거되지 않았음) /proc/[pid]/cmdline
신뢰할 수 있다고 가정할 수 있습니까(아래 참고 사항 참조)?
~에 따르면공정(5): 및 를 /proc/[pid]/environ
포함한 초기 환경 변수를 포함합니다(프로그램 자체가 내부 환경 변수를 변경하더라도 변경되지 않음) .PWD
PATH
따라서
in의 경로가 cmdline
상대 디렉터리 이름으로 시작하는 경우 PWD
(in /proc/[pid]/environ
)을 기본 경로로 사용하고 상대 경로를 확인할 수 있습니다.
in의 경로가 프로그램 자체의 이름인 경우 ( 의 각 디렉터리를 cmdline
반복할 수 있습니다. ) PATH
에서 /proc/[pid]/environ
목표는첫 번째같은 이름의 파일.
참고 사항:
/proc/[pid]/exe
역참조된 것으로 보이는 파일(예: 심볼릭 링크 /usr/bin/python3.6
대신 /usr/bin/python3
또는 /usr/bin/python
심볼릭 링크인 경우)
/proc/[pid]/cmdline
또한 일부 프로그램에 대한 이상한 정보가 포함되어 있어 신뢰할 수 없을 수도 있습니다. 이것은 프로그램과 관련된 것 같지만 커널과 관련된 것은 아닌 것 같습니다. 그리고 저는 이런 방식으로 실행되는 Python 스크립트를 관찰하지 못했습니다(그리고 sys.argv
Python에서 편집해도 영향을 미치지 않는 것 같습니다 /proc/[pid]/cmdline
).내 질문이것에 대해서도 조금 이야기했습니다.
답변2
실험적으로 bash의 경우 /proc/{pid}/fd/255
실행된 스크립트의 전체 경로에 대한 링크입니다.
#! /bin/bash
ls -l /proc/$$/fd/255