그들은하지 않습니다.

그들은하지 않습니다.

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

screenSCREEN이후 클라이언트와 구별하기 위해 기본(서버) 프로세스의 이름을 바꿉니다 .

이것은 매뉴얼 페이지에서 매우 간접적으로 언급된 적이 있습니다:

이 명령은 기본 "SCREEN" 프로세스의 올바른 디버그 출력에만 영향을 미칩니다. 어펜더 프로세스에 대한 디버그 출력은 한 번만 영구적으로 끌 수 있습니다.

그런데 이상하게도 제가 볼 수 있는 곳 어디에도 명시적으로 언급되어 있지 않습니다.

ps그리고 ps -f실행 파일 이름( ps"command" 형식 지정자)과 재구성된 명령줄( ps -f"args" 형식 지정자) 등 CMD에 대한 다양한 콘텐츠를 표시합니다. 후자는 프로세스의 ARGV를 사용하여 변경되는 것을 확인하지만 실행 파일 이름 자체는 변경되지 않습니다.

답변2

그들은하지 않습니다.

엄밀히 말하면 문제다그들이 한 짓에 대해서는 답이 없습니다. 그것은 거짓말을 전제로 한 것입니다.

cmd여기에는 및 ucmd열, 두 개가 표시됩니다.다른정보 조각. 불행하게도 GNU ps프로그램과 FreeBSD ps프로그램 모두 상황을 매우 혼란스럽게 만듭니다.

/procLinux 및 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열에는 다음 정보가 포함됩니다:

  • commandargs매개변수 문자열, 환경 문자열( e이 옵션을 사용하는 경우) 및 대괄호로 묶인 계정 이름(이 옵션이 사용되고 마지막 매개변수 문자열과 일치하지 않는 경우) 으로 명명된 열 d입니다. 열이 하나 있으면 모든 열 앞에 트리맵이 붙습니다.
  • 이름이 지정되고 프로세스 계정 이름을 포함합니다 ucomm.comm

GNU는 ps전자에 별칭을 추가하고 후자에 별칭을 추가합니다. 트리맵과 환경 문자열을cmducmd둘 다열을 만들고 항상 덴드로그램을 그 열에 넣습니다.아니요마지막 열.

GNU의 경우 ps, 질문에 있는 옵션 -f(옵션과 혼동하지 마세요 )은 f인쇄할 -Af다양한 열 세트를 지정하기 위한 약식일 뿐입니다. ps기본 열 집합에는 포함 집합이 포함됩니다 ucmd. -f이 옵션을 사용하면 집합 재정의가 사용됩니다 cmd.

BSD 매뉴얼에서는 ps, 및 약어로 선택할 수 있는 정확한 열을 제공하여 이를 명확하게 설명합니다. GNU 매뉴얼에서는 "전체 형식", "작업 형식", "긴 형식" 및 "사용자 형식"을 언급하지만 각 형식이 어떤 열 집합인지 명시적으로 나열하지는 않습니다.-j-l-u-vps

상황을 더욱 혼란스럽게 만들기 위해 GNU ps나 FreeBSD ps모두 출력에서 ​​제공하는 열 헤더의 명령줄에 사용된 열 이름을 사용하지 않습니다. 따라서 열 머리글만으로는 실제로 어떤 열이 표시되는지 알 수 없는 경우가 많습니다.

  • FreeBSD는 ps계정 이름 열을 또는 로 표시 UCOMM하고 COMMAND매개변수 문자열 열도 표시합니다 COMMAND.
  • GNU는 ps매개변수 문자열 열을 OR로 표시 CMD하고 COMMAND회계 이름 열도 CMDOR 로 표시합니다 COMMAND.

s6-ps(비교를 위해 Laurent Bercot의 유일한 comm고정 argsenv고유 헤더 레이블인 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.

관련 정보