참조 매개변수가 포함된 프로세스 목록, 이식 가능

참조 매개변수가 포함된 프로세스 목록, 이식 가능

proc이나 기타 비표준 도구를 사용하지 않고 명령줄에서 원래 명령을 실행하려면 어떻게 해야 합니까?

인쇄 프로세스 목록을 사용할 때 ps명령을 시작하기 위해 전달된 매개변수는 따옴표 없이 표시되며 이는 원래 명령이 실행된 방식이 아닙니다. ps이를 달성할 수 있는 옵션 조합 도 없는 것 같습니다.

한참을 검색하고, 찾기 힘든 ps소스코드를 찾아봐도 여전히 간단한 답을 찾지 못했습니다. 현재 동일한 문제를 언급하는 다른 게시물이 있지만 답변이 없거나 만족스럽지 못한 솔루션을 제공합니다. ps필요한 결과를 얻기 위해 소스 코드를 편집할 수 있지만 이 접근 방식은 ps사실상 운영 체제마다 인코딩이 크게 다른 비표준 패키지이므로 권장되지 않습니다. 예를 들어 psMacOS의 소스 코드는 Ubuntu의 소스 코드와 매우 다릅니다 ps.

답변1

다른 프로세스의 명령줄을 명시적으로 표현하는 이식 가능한 방법은 없습니다. 불가능하기 때문에 원하는 답을 찾지 못했습니다. 모호한 표현을 처리하거나, 코드가 실행 중인 운영 체제에 따라 다른 접근 방식을 사용하거나, 작업을 대신 수행하는 사람을 찾아야 합니다.

이것POSIX 사양ps이 필드 의 형식 args은 "명령과 모든 인수를 문자열로 포함"하고 잘릴 수 있다는 점을 제외하고는 지정되지 않습니다. 실제로 내가 본 모든 구현은 인수를 공백으로 인수에 연결합니다. 이것이 POSIX로 할 수 있는 최선의 방법입니다.

프로세스의 명령줄 인수를 명시적으로 표현하려면 Solaris와 같은 proc 파일 시스템을 사용하는 Linux 및 기타 Unix 변형에서 찾을 수 있습니다(따라서 macOS와 같은 BSD 시스템에서는 찾을 수 없음). 매개변수는 매개변수에 나타날 수 없는 널 바이트로 구분되므로 표현이 명확합니다. 나는 Linux procps 유틸리티를 사용하여 이 정보를 얻을 수 있는 방법이 없다고 생각하며, 만약 있었다고 해도 그것은 Linux에만 국한될 것이므로 이식성이 더 높지는 않을 것입니다(실제로는 찾아보기도 하기 때문에 이식성이 떨어집니다). Linux 커널의 다른 유틸리티(예: BusyBox의 유틸리티)가 있는 시스템에서 작동합니다./proc/PID/cmdlineps/procps

macOS에서 명령줄 인수를 명시적으로 표현하는 방법을 모르겠습니다.

이식 불가능한 부분을 수행하는 프로그램을 알고 있습니다.파이썬 라이브러리프수틸. Linux에서 프로세스의 명령줄을 명시적으로 표현할 수 있다는 것을 확인할 수 있습니다. 문서에 제한 사항이 언급되어 있지 않기 때문에 macOS에서도 작동할 것입니다. 하지만 아직 테스트해 본 적은 없습니다.

python3 -c 'import os, psutil; print(psutil.Process(os.getpid()).cmdline())'

관련 정보