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はコマンド全体の一部ですが、コマンド名ではありません。

commandcmdおよびはのエイリアスで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
    

関連情報