저는 리눅스에서 일하고 있어요.
실행 중인 프로그램의 PID가 주어지면 사용자 정의 프로그램 이름을 얻을 수 있는 방법이 있습니까?
프로세스 이름이 아닌 프로그램 이름을 출력하고 싶습니다.
예를 들면 java
다음과 같습니다 .스택 오버플로.java. 이제 프로세스 이름은 시스템에 의해 결정되며 다를 수 있지만 프로그램 이름은스택 오버플로.java. 따라서 출력은 프로그램 이름이어야 하며 실행 중인 프로그램의 PID만 제공해야 합니다.
다음과 같은 일부 요구 사항을 충족하는 몇 가지 명령이 있습니다.
cat /proc/"PID"/cmdline
-> 이는 주어진 "PID"를 사용하여 프로세스를 생성하기 위한 명령줄 인수를 제공합니다. 그러나 다양한 프로그래밍 언어로 된 다양한 프로그램이 있는 경우 프로그램을 실행하는 명령 형식이 달라집니다. 그렇다면 이 명령에서 정확한 프로그램 이름을 어떻게 추출할 수 있습니까?
readlink -f /proc/"PID"/exe
-> "PID"가 지정된 프로세스와 관련된 실행 파일 이름이 제공됩니다. 그러나 일부 프로세스에는 실행 파일이 없습니다. 이 경우 아무것도 반환하지 않습니다.
나는 실제로 대규모로 작업하고 있습니다. 서버에서 실행되는 모든 프로세스의 애플리케이션 이름(또는 소스 파일 이름이나 프로그램 이름)을 찾고 싶습니다. 따라서 Java, cpp, Python 등과 같은 프로그래밍 언어에 대해 특별히 하드코딩하고 싶지 않습니다. 이와 관련하여 일반적인 것을 제안해 주십시오.
답변1
유효한 <pid>
,
/bin/cat /proc/<pid>/comm
그러면 실행 파일의 이름이 제공됩니다.
/bin/ls -lt /proc/<pid>/exe
실행 파일의 경로는 위에 나와 있습니다.
답변2
존재하지 않는 개념을 정의하려고 합니다. 실행 파일 이름 외에는 "프로그램 이름"이나 "응용 프로그램 이름"에 대한 일반적인 개념을 찾을 수 없습니다.
소스 파일 이름에스일반적으로 실행 파일에 저장되지 않습니다. 스크립트의 경우 "기본" 소스 파일 이름은 실행 파일이지만 스크립트는 다른 여러 위치(적어도 인터프리터)의 코드도 사용합니다. 컴파일된 프로그램의 경우 이 정보는 컴파일러나 빌드 체인 관련 항목이 해당 위치에 저장되지 않는 한 런타임 시 사용할 수 없습니다. 대부분의 경우에는 그렇지 않습니다.
/proc/$pid/exe
주어진 실행 파일의 경로를 봅니다 . 모든 프로세스에는 실행 파일이 있습니다. 프로세스가 시작된 이후 실행 파일의 이름이 바뀌거나 삭제되었을 수 있습니다. 이것이 "프로그램 이름"의 유일한 공통 개념입니다.
첫 번째 요소는 /proc/$pid/cmdline
프로세스 호출 시 전달된 매개변수 0입니다. 이름은 프로세스 호출자가 선택합니다. 호출자가 구체적으로 지정하지 않는 한 이는 일반적으로 프로그램이 PATH 조회를 통해 호출되었는지 여부에 따라 디렉터리 부분이 있거나 없는 실행 파일의 기본 이름입니다. 프로세스는 이 부분을 재정의할 수 있지만 이를 수행하는 프로그램은 거의 없습니다(대부분 일부 데몬은 쉽게 볼 수 있는 방식으로 상태를 반영하기 위해 이 작업을 수행합니다 ps
).
Linux는 또한 ps -o comm
. 를 통해 접근할 수 있습니다 /proc/$pid/status
. 16바이트로 잘린 실행 파일의 초기 기본 이름입니다.
¹ 일부 항목 /proc
에 대한 링크를 exe
읽을 수 없습니다. 이는 프로세스가 아닌 커널 스레드 또는 좀비입니다. 링크는 모든 프로세스에서 읽을 수 있지만(적절한 권한이 있는 경우) 실행 파일이 삭제된 경우 기존 파일을 가리키지 않을 수 있습니다.
답변3
항상 가능한 것은 아니기 때문에 이 문제에 대한 보편적인 해결책은 없습니다. C 프로그램이 있고 blue.c
사용하는 경우
cc blue.c -o green
그런 다음 실행 파일을 실행하면 내 디렉토리 검색과 같은 법의학적 조치 없이는 green
소스 이름이 무엇인지 확인할 수 있는 방법이 없습니다 . blue.c
(이 진술은 적어도 일부 C 컴파일러에 적용됩니다.)