CentOS 7.0.1406에서 실행할 때 다른 출력이 나타납니다.
ps -A -o pid,command | grep [r]esque
내가 달릴 때보다
ps -A -o pid,comm | grep [r]esque
후자는 아무것도 반환하지 않습니다. 전자는 제가 기대하는 것입니다. 내 생각엔 이것이 comm
의 별칭인 것 같습니다 command
. 누군가 차이점을 설명할 수 있나요?
답변1
별칭이 아니며 command
출력됩니다 .전체 명령그리고 comm
오직명령 이름이므로 출력이 다를 수 있습니다. 그것은 모두 grep 명령으로 추출하려는 내용에 따라 다릅니다.
한 가지 예:
$ ps -A -o pid,command | grep 9600
376 /sbin/agetty --keep-baud 115200 38400 9600 ttyS0 vt220
그리고 다음의 출력은 비어 있습니다.
ps -A -o pid,comm | grep 9600
이 문자열 9600
은 전체 명령의 일부이지만 명령 이름은 아닙니다.
command
, 및 cmd
는 의 별칭이며 args
, with 는 명령과 모든 인수를 문자열로 인쇄합니다. comm
실행 파일 이름만 인쇄하는 다른 정렬 코드입니다. 매뉴얼 페이지 조각:
args COMMAND command with all its arguments as a string.
cmd CMD see args. (alias args, command).
comm COMMAND command name (only the executable name).
command COMMAND see args. (alias args, cmd).
답변2
Linux에서는 (적어도) procps(-ng)를 사용하여 이를 수행합니다 ps
(CentOS의 경우).
comm
프로세스 이름입니다. 16바이트에서 검색되며/proc/<pid>/stat
16바이트로 제한됩니다(잘림). 이는 일반적으로 프로세스(또는 그 조상)가 수행한 마지막 시스템 호출의 첫 번째 인수의 기본 이름입니다 . 단, 커널 스레드인 경우에는 또는 또는와execve()
같은 커널 스레드의 이름입니다. 또는 프로세스가 이를 변경하는 데 사용되었습니다 . 이는 출력 의 필드 입니다 .watchdog/0
rcu_sched
prctl(PR_SET_NAME)
CMD
ps
command
일명 프로세스(또는 그 조상)가 수행한 최신 시스템 호출에args
전달된 인수의 연결 입니다.execve()
인수가 없는 경우(예: 커널 스레드) (위와 같이 대괄호로 묶인 프로세스 이름)ps
가 사용됩니다 .[process-name]
이것은 에서 검색되었습니다/proc/<pid>/cmdline
. 이는 출력CMD
의 필드 입니다ps -f
. 스크립트의 경우execve()
구문 분석 후 she-bang이 내부적으로 다시 호출됩니다. 프로세스는 수신한 argv[] 문자열을 덮어써서 값을 변경할 수도 있습니다.
POSIX 지정 comm
(yes를 의미함 argv[0]
) 및 args
(인수 문자열 목록으로, 목록이 어떻게 표현되는지는 명시되어 있지 않지만(공백으로 연결됩니까?)) 대신 command
. 따라서 이 구현은 argv[0]이 없기 procps
때문에 요구 사항을 충족하지 않습니다 . comm
Solaris의 인증된 구현에는 argv[0]이 있으며 procps' ( 출력 의 열 ) 와 동일 comm
합니다 .fname
comm
CMD
ps
예:
과의 관계
execve()
:$ ln -s /bin/sleep very-long-alias-for-sleep $ strace -e execve bash -c 'exec -a different-argv0 ./././very-long-alias-for-sleep 12' & execve("/bin/bash", ["bash", "-c", "exec -a different-argv0 ./././ve"...], [/* 52 vars */]) = 0 10:56 execve("/home/stephane/././very-long-alias-for-sleep", ["different-argv0", "12"], [/* 51 vars */]) = 0 $ ps -o comm,command COMMAND COMMAND [...] very-long-alias different-argv0 12 [...]
perl
프로세스 이름과 인수 목록을 재정의합니다.$ perl -e '$0 = "new name"; system("ps -p $$ -o comm,command")' COMMAND COMMAND new name new name
스크립트 동작:
$ cat test-script #! /bin/sh -e ps -o comm,command -p "$$" exit $ strace -e execve ./test-script arg execve("./test-script", ["./test-script", "arg"], [/* 52 vars */]) = 0 COMMAND COMMAND test-script /bin/sh -e ./test-script arg
/bin/sh
결국 다른 매개변수 목록으로 실행되지만 프로세스 이름은 그대로 유지됩니다test-script
. 여기서 받은argv[0]
것은sh
입니다/bin/sh
.일부 시스템test-script
에서는.조상에 관한 참고 사항:
$ ((((ps -o pid,comm,command;:);:);:);:) PID COMMAND COMMAND 4109 zsh /bin/zsh 23146 zsh /bin/zsh 23147 zsh /bin/zsh 23148 zsh /bin/zsh 23149 zsh /bin/zsh 23150 ps ps -o pid,comm,command
2314{6,7,8,9} 프로세스는 어떤 명령도 실행하지 않았으며 /bin/zsh를 실행한 상위 프로세스(4109)로부터 프로세스 이름과 매개변수 목록을 상속했습니다.
23150
자체적으로 처음에는 다른 프로세스와 같은 프로세스 이름을 갖지만zsh
실행 시 이름이 변경됩니다.ps
/bin/ps
-o 'comm'
스레드를 이름으로 구별하는 데 사용됩니다 .$ ps -T -o pid,tid,pcpu,bsdtime,comm,command -C firefox.real | sort -k3nr # result is sorted by third column '%CPU' 10743 10743 4.9 14:44 firefox.real /usr/bin/firefox.real --private-window 10743 10775 0.3 1:01 Compositor /usr/bin/firefox.real --private-window 10743 10750 0.0 0:00 Gecko_IOThread /usr/bin/firefox.real --private-window 10743 10751 0.0 0:16 Timer /usr/bin/firefox.real --private-window 10743 10752 0.0 0:00 Link Monitor /usr/bin/firefox.real --private-window 10743 10753 0.0 0:06 Socket Thread /usr/bin/firefox.real --private-window 10743 10755 0.0 0:00 JS Watchdog /usr/bin/firefox.real --private-window 10743 10756 0.0 0:04 JS Helper /usr/bin/firefox.real --private-window ... PID TID %CPU TIME COMMAND COMMAND