"ps -p proc1 proc2 proc3"은 "-csh", "-tcsh" 및 "-/bin/tcsh"를 표시하는 반면 "ps -p proc[n]"은 "tcsh"만 표시하는 이유는 무엇입니까?

"ps -p proc1 proc2 proc3"은 "-csh", "-tcsh" 및 "-/bin/tcsh"를 표시하는 반면 "ps -p proc[n]"은 "tcsh"만 표시하는 이유는 무엇입니까?

나는 (csh가 아닌) tcsh를 사용했고 pgrep csh | xargs ps -p왜 csh를 실행하는 것 같은지 알아보기 위해 실행했습니다. 일부 결과:

 1529 pts/0    Ss     0:00 -csh
 1764 pts/3    Ss     0:00 -tcsh
 1979 pts/4    Ss+    0:00 -bin/tcsh

그런 다음 나는 ps -p 1529 1764 1979동일한 결과를 얻었습니다.

  PID TTY      STAT   TIME COMMAND
 1529 pts/0    Ss     0:00 -csh
 1764 pts/3    Ss     0:00 -tcsh
 1979 pts/4    Ss+    0:00 -bin/tcsh

그럼 내가 그랬어ps -p 1529; ps -p 1764; ps -p 1979

  PID TTY          TIME CMD
 1529 pts/0    00:00:00 tcsh
  PID TTY          TIME CMD
 1764 pts/3    00:00:00 tcsh
  PID TTY          TIME CMD
 1979 pts/4    00:00:00 tcsh

ps --version주고 procps-ng version 3.3.10생산 tcsh --version하십시오 tcsh 6.19.00 (Astron) 2015-05-21 (x86_64-unknown-linux) options wide,nls,dl,al,kan,sm,rh,color,filec.

왜 이렇게 이상한 행동을 하는 걸까요? 프로세스 모니터를 작성하려고 하는데 tcsh가 세 가지 다른 형식을 취하도록 하는 것이 짜증스럽습니다.

답변1

서로 다른 두 분야를 비교하고 있습니다.

제목 줄에 주의하세요. dash 가 있는 것과 COMMANDtcsh 가 있는 것이 있습니다 CMD. 보다표준 형식 지정자부분man 1 ps맨 페이지.

기본적으로:

  • cmd( CMD)는 매개변수가 모두 문자열인 명령이다.

  • comm( COMMAND)는 프로세스가 실행 중인 실행 파일의 이름입니다.

Linux에서는 후자를 개별 스레드 prctl(PR_SET_NAME, string)뿐만 아니라 전체 프로세스에 대해 설정할 수도 있습니다. 하지만 제한은 16자입니다.pthread_setname_np(thread, string)string

쉘은 일반적으로 프로세스 목록이 논리적으로 올바르게 보이도록 실행 시 기호 링크나 패턴을 기반으로 이름을 설정합니다. 특히 대시로 시작하는 이름(예: -tcsh)은 다음을 나타내는 데 사용됩니다.로그인껍데기.

OP의 예에는 쉘 바이너리를 실행하는 세 개의 쉘이 있으며 tcsh, 그 세 개 모두는 다음과 같습니다.로그인 쉘, 그 중 하나가 csh모드에 있습니다.

로그인 쉘특정 대화형 모드의 셸입니다. 셸은 스크립트를 실행하는 셸과 약간 다르게 동작합니다. 스크립트에는 필요하지 않지만 사람이 셸을 더 쉽게 사용할 수 있도록 하는 추가 기능이 포함된 모드라고 생각하세요.

OP는 거의 확실하게 csh별칭을 사용했으며 세 개의 쉘은 tcsh각각 및로 시작했습니다. 명령으로 실행된 실제 바이너리를 찾으려면 .tcsh -lcsh -lbin/tcsh -lrealpath $(which command)

답변2

이것은 Linux 명령에 있어 이상한 점입니다 ps. ps전달한 옵션을 기반으로 변형을 추측하여 여러 Unix 변형의 동작을 에뮬레이션하려고 시도합니다 . 책에서는 이것을 '성격'이라고 표현한다.매뉴얼 페이지.

추측된 변형에 따라 기본 출력 필드 세트가 다릅니다. Linux 특성에서는 ("PID"), ("TTY"), ("TIME") 및 ("CMD") 열이 ps표시됩니다 . BSD 특성에서 "PID", "TTY", time comm ps -p 1529 ps -p 1529 1764 1979 -p 1529 1764 1979 ps -p ps ps 1529`를 표시합니다 .pidttytimeargspspidttystat “STAT”,“TIME” and“COMMAND”.is (historically) System V syntax, and in that case Linux chooses the Linux personality.has theoption with the argument, and two more argumentsand(they're argument toitself, not to theoption). With a process ID as argument,chooses the BSD output format. You get the same with

args열(별칭 , 제목 "CMD")과 열(제목 "COMMAND") command의 차이점 comm은 CMD는 모든 인수가 공백으로 구분된(잘릴 수 있음) 명령줄을 표시하는 반면 COMMAND는 실행 파일 이름만 표시한다는 것입니다. 관례적으로 프로그램 명령줄의 첫 번째 인수(인수 번호 0)는 일반적으로 실행 파일의 이름입니다. 그러나 쉘이 로그인 쉘로 호출되면 매개변수 0 앞에 대시( -)가 붙습니다. 이를 통해 쉘은 로그인 쉘로 작동해야 함을 감지합니다. 이 주제에 대해서는 다음을 참조하십시오.로그인 쉘과 비로그인 쉘의 차이점은 무엇입니까?그리고`--login` 옵션으로 호출된 로그인 셸에서 $0에 단일 하이픈이 표시되지 않는 이유는 무엇입니까?

나타남 csh과 친척은 어딘가로 tcsh달려갔다는 뜻이다 csh. if 가 csh단지 상징적이라는 사실을 눈치채지 못했을 수도 있습니다 tcsh.

관련 정보