web-dev-qa-db-ja.com

Linuxでは、psはカーネル以外のプロセスのみを表示できますか?

カーネルスレッドではなくユーザープロセスのみを表示するようにpsに要求するにはどうすればよいですか?

この質問 を参照して、私の意味を確認してください...

42
Totor

これは(Linuxで)実行する必要があります。

ps --ppid 2 -p 2 --deselect

kthreadd(PID 2)にはPPID 0(Linux 2.6 +)がありますが、psではPPID 0をフィルターできません。したがって、この回避策です。

39
Hauke Laging

実際には、次のイディオムを十分に見つけました。

ps auxf | grep -v ]$

かっこで終わる行をフィルター処理しますmightは不要なエントリを省略しますが、ほとんどありません。代わりに、覚えるのは非常に簡単で、タイプするのも比較的簡単です。

Avahi-daemonのような一部のプロセスは、プロセス名の情報を角かっこで追加し(avahi-daemonの場合はホスト名)、このコマンドによって除外されます。

9
onetom

カーネルプロセスを認識する1つの方法は、それらがユーザーメモリを使用しないため、vszフィールドが0であることです。これは、ゾンビをキャッチします(この観測に対して Stephane Chazelas に感謝します)。彼らのステータスについて。

ps axl | awk '$7 != 0 && $10 !~ "Z"'

PIDのみをリストするには:

ps -e -o pid= -o state= -o vsize= | awk '$2 != "Z" && $3 != 0 {print $1}'

これらのプロセスの特殊性の1つは、実行可能ファイルによってサポートされないため、(in zsh)を実行できることです。

ps /proc/[0-9]*/exe(^-@:h:t)

または任意のPOSIXシェル:

ps -p "$(find -L /proc/[0-9]*/exe ! -type l | cut -d / -f3 | paste -sd , -)"

つまり、/proc/<pid>/exeがファイルへのリンクであるプロセスをチェックします。

ただし、/proc/<pid>/exeシンボリックリンクの状態を確認するには、スーパーユーザーである必要があります。

編集:たまたまゾンビプロセスは同じ条件を満たしているため、除外したくない場合は、元に戻す必要があります。お気に入り:

ps -p "$(
  { find -L /proc/[0-9]*/exe ! -type l | cut -d / -f3
    ps -Ao pid=,state= | sed -n 's/ Z//p'
  } | paste -sd , -)"

ps -fは、それらのプロセス名を角かっこで示しています。これは、それらがカーネルプロセスであるためではなく、空のargv[]があるためです(したがって、psはargv[0]ではなくプロセス名を示します)。空のargv[]を使用してユーザー空間プロセスを作成することも、argv[0]の形式で[some-string]を使用してプロセス名を作成することもできるため、角括弧に基づいてps出力をフィルタリングします。間違いのないオプションではありません。

8

psの出力を解析して、括弧内にないプロセス名を探すこともできます。

ps aux | awk '$NF!~/^\[.+\]$/'
1
terdon

psが大幅に簡略化されており、出力が異なる場合、busyboxでこれを試す人にとっては、Gillesの素晴らしい答えのこのバリアントがうまく機能します。

ps -o pid,user,comm,vsz,stat | awk '$4 != 0 && $5 !~ "Z"'

Gillesの回答によると、ここでの方法は、ユーザーメモリを使用しないプロセス( `vsz col == 0)を見つけ、ゾンビプロセスを除外することです(ステータスcolは 'Z'ではありません)。

1ベースのawkフィールド番号が適切に調整されている限り、出力列は簡単に調整できます。偽の値を入力して、psが利用できるオプションを確認してください。例えば:

$ ps -o foo
ps: bad -o argument 'foo', supported arguments: user,group,comm,args,pid,ppid,pgid,tty,vsz,stat,rss
1
Russ

あなたが探しているのは、私の友人です、psではなくpstreeです。

まず、最初のカーネルプロセスを特定します。そのPIDは通常、systemdのないシステムでは1、systemdのあるシステムでは2です。

次に、次のコマンドを使用します。

$ pstree -p <1 or 2> | grep -o '([0-9]\+)' | grep -o '[0-9]\+'

選択された回答(with付きの回答)は別のコマンドを使用しています:

$ ps --ppid 2 -p 2 --deselect

このpsコマンドの問題は、直接の子のみが含まれ、すべての子孫は含まれないことです。 pstreeコマンドには、すべての子孫が含まれます。これら2つのコマンドの出力を比較およびカウントして(| wcを使用するのが簡単な方法です)、確認できます。

0
ssppjj

カウントのみが必要な場合...カーネル対ユーザープロセスを同様にフィルタリングする必要がありましたが、それぞれのカウントのみが必要でした。これは私の解決策でした:

ps -eo vsize | awk '{p[$1==0]++} END {printf "%-16s %6d\n%-16s %6d\n%-16s %6d\n", "Kernel processes", p[1], "User processes", p[0], "Total processes", p[0]+p[1]}'

出力例

Kernel processes    353
User processes       52
Total processes     405

説明:VSZ = 0プロセスがカーネルプロセスであると想定できるハックを使用しています。したがって、awkを使用して、VSZでの比較を評価します(ps -eo vsizeから)。比較の結果はブール値0または1になります。配列p[]を作成し、プロセスのリストを実行していくと、それがカーネルプロセスの場合はp[1]++をインクリメントします。それ以外の場合は、ユーザープロセスとしてp[0]++をインクリメントします。すべてのインクリメントの後、END { }ブロックのp [0]およびp [1]の値(つまり、カウント)にラベルを付けて出力します。

0
Joshua Huber

そのために psa スクリプトを作成しました。 linechop ツールに依存することに注意してください。

0