나는 (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 가 있는 것과 COMMAND
tcsh 가 있는 것이 있습니다 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 -l
csh -l
bin/tcsh -l
realpath $(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`를 표시합니다 .pid
tty
time
args
ps
pid
tty
stat “STAT”,
“TIME” and
“COMMAND”.
is (historically) System V syntax, and in that case Linux chooses the Linux personality.
has the
option with the argument
, and two more arguments
and
(they're argument to
itself, not to the
option). 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
.