ps - -o comm과 -o 명령의 차이점은 무엇입니까?

ps - -o comm과 -o 명령의 차이점은 무엇입니까?

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>/stat16바이트로 제한됩니다(잘림). 이는 일반적으로 프로세스(또는 그 조상)가 수행한 마지막 시스템 호출의 첫 번째 인수의 기본 이름입니다 . 단, 커널 스레드인 경우에는 또는 또는와 execve()같은 커널 스레드의 이름입니다. 또는 프로세스가 이를 변경하는 데 사용되었습니다 . 이는 출력 의 필드 입니다 .watchdog/0rcu_schedprctl(PR_SET_NAME)CMDps
  • 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때문에 요구 사항을 충족하지 않습니다 . commSolaris의 인증된 구현에는 argv[0]이 있으며 procps' ( 출력 의 열 ) 와 동일 comm합니다 .fnamecommCMDps

예:

  • 과의 관계 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
    

관련 정보