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