ps의 다음 두 명령이 서로 다른 CMD
필드를 제공하는 이유는 무엇입니까? 이는 screen
서로 다르기 때문에 중요합니다 SCREEN
. 첫 번째는 클라이언트이고 두 번째는 서버입니다. 감사해요.
$ ps -A | grep -i screen
3341 ? 00:00:00 screen
3875 ? 00:00:00 screen
27525 ? 00:00:00 screen
$ ps -Af | grep -i screen
testme 3341 1 0 2018 ? 00:00:00 SCREEN -S testme
testme 3875 1 0 2018 ? 00:00:00 SCREEN -S tm
t 27525 1 0 2018 ? 00:00:00 SCREEN -S test
SCREEN
프로그램도 아닌데 왜 나타나는 걸까요 ps
?
$ SCREEN
SCREEN: command not found
답변1
screen
SCREEN
이후 클라이언트와 구별하기 위해 기본(서버) 프로세스의 이름을 바꿉니다 .
이것은 매뉴얼 페이지에서 매우 간접적으로 언급된 적이 있습니다:
이 명령은 기본 "SCREEN" 프로세스의 올바른 디버그 출력에만 영향을 미칩니다. 어펜더 프로세스에 대한 디버그 출력은 한 번만 영구적으로 끌 수 있습니다.
그런데 이상하게도 제가 볼 수 있는 곳 어디에도 명시적으로 언급되어 있지 않습니다.
ps
그리고 ps -f
실행 파일 이름( ps
"command" 형식 지정자)과 재구성된 명령줄( ps -f
"args" 형식 지정자) 등 CMD에 대한 다양한 콘텐츠를 표시합니다. 후자는 프로세스의 ARGV를 사용하여 변경되는 것을 확인하지만 실행 파일 이름 자체는 변경되지 않습니다.
답변2
그들은하지 않습니다.
엄밀히 말하면 문제다왜그들이 한 짓에 대해서는 답이 없습니다. 그것은 거짓말을 전제로 한 것입니다.
cmd
여기에는 및 ucmd
열, 두 개가 표시됩니다.다른정보 조각. 불행하게도 GNU ps
프로그램과 FreeBSD ps
프로그램 모두 상황을 매우 혼란스럽게 만듭니다.
/proc
Linux 및 BSD 커널과 같은 커널은 및 의 파일을 통해 프로세스에 대한 네 가지 관련 정보를 제공합니다 sysctl()
.
- 프로세스 회계에 사용되는 약어로도 알려진 프로그램 이미지 약어입니다.
- 해당 매개변수 문자열은
execve()
런타임에 의해 초기화되며 수정될 수 있습니다. execve()
런타임에 의해 초기화되고 수정 가능한 환경 문자열입니다 .- 실행 가능한 프로그램 이미지 파일의 전체 경로 이름입니다.
매개변수 문자열과 환경 문자열은 앞서 설명한 대로 런타임에 수정될 수 있습니다.https://unix.stackexchange.com/a/438007/5132그리고https://unix.stackexchange.com/a/432681/5132. Linux에서는 프로세스 계정 이름을 수정할 수도 있습니다.
GNU Screen은 첫 번째 인수 문자열이 "SCREEN"이 되도록 인수 문자열을 수정했지만 프로세스 계정 이름은 여전히 "screen"이 아닙니다.
이 네 가지 정보를 표시하는 데는 두 개의 열만 사용됩니다 ps
. FreeBSD에서 ps
열에는 다음 정보가 포함됩니다:
command
args
매개변수 문자열, 환경 문자열(e
이 옵션을 사용하는 경우) 및 대괄호로 묶인 계정 이름(이 옵션이 사용되고 마지막 매개변수 문자열과 일치하지 않는 경우) 으로 명명된 열d
입니다. 열이 하나 있으면 모든 열 앞에 트리맵이 붙습니다.- 이름이 지정되고 프로세스 계정 이름을 포함합니다
ucomm
.comm
GNU는 ps
전자에 별칭을 추가하고 후자에 별칭을 추가합니다. 트리맵과 환경 문자열을cmd
ucmd
둘 다열을 만들고 항상 덴드로그램을 그 열에 넣습니다.아니요마지막 열.
GNU의 경우 ps
, 질문에 있는 옵션 -f
(옵션과 혼동하지 마세요 )은 f
인쇄할 -Af
다양한 열 세트를 지정하기 위한 약식일 뿐입니다. ps
기본 열 집합에는 포함 집합이 포함됩니다 ucmd
. -f
이 옵션을 사용하면 집합 재정의가 사용됩니다 cmd
.
BSD 매뉴얼에서는 ps
, 및 약어로 선택할 수 있는 정확한 열을 제공하여 이를 명확하게 설명합니다. GNU 매뉴얼에서는 "전체 형식", "작업 형식", "긴 형식" 및 "사용자 형식"을 언급하지만 각 형식이 어떤 열 집합인지 명시적으로 나열하지는 않습니다.-j
-l
-u
-v
ps
상황을 더욱 혼란스럽게 만들기 위해 GNU ps
나 FreeBSD ps
모두 출력에서 제공하는 열 헤더의 명령줄에 사용된 열 이름을 사용하지 않습니다. 따라서 열 머리글만으로는 실제로 어떤 열이 표시되는지 알 수 없는 경우가 많습니다.
- FreeBSD는
ps
계정 이름 열을 또는 로 표시UCOMM
하고COMMAND
매개변수 문자열 열도 표시합니다COMMAND
. - GNU는
ps
매개변수 문자열 열을 OR로 표시CMD
하고COMMAND
회계 이름 열도CMD
OR 로 표시합니다COMMAND
.
s6-ps
(비교를 위해 Laurent Bercot의 유일한 comm
고정 args
및 env
고유 헤더 레이블인 COMM
, COMMAND
, 및 ENVIRONMENT
는 커널의 정보 4개 중 처음 3개를 결합하지 않고 직접 제공합니다.)
- 로랑 벨코트(2014).
s6-ps
.s6-리눅스-유틸. 소프트웨어.
답변3
ps -A
기본 형식을 사용하여 pid, 터미널, 누적 CPU 시간 및 실행 파일 이름( ucmd
)을 표시합니다. 실행 파일 이름은 수정할 수 없으며 사용된 실행 파일 이름을 정확하게 반영합니다.
ps -Af
다른 필드 외에 인수( comm
, 또는 )와 함께 전체 명령을 표시하는 전체 형식을 사용합니다 args
. 전체 명령은 다음에 설명된 대로 수정 가능합니다.마이클 호머~의답변, screen
프로세스가 클라이언트인지 서버인지 표시하도록 수정합니다.
screen
프로세스를 찾고 그 목적을 결정하려면 다음을 사용하십시오.
ps -fC screen
여기에는 실행 파일 이름이 일치하는 프로세스의 전체 세부 정보가 표시됩니다 screen
.