カーネルスレッドではなくユーザープロセスのみを表示するようにps
に要求するにはどうすればよいですか?
この質問 を参照して、私の意味を確認してください...
これは(Linuxで)実行する必要があります。
ps --ppid 2 -p 2 --deselect
kthreadd
(PID 2)にはPPID 0(Linux 2.6 +)がありますが、ps
ではPPID 0をフィルターできません。したがって、この回避策です。
実際には、次のイディオムを十分に見つけました。
ps auxf | grep -v ]$
かっこで終わる行をフィルター処理しますmightは不要なエントリを省略しますが、ほとんどありません。代わりに、覚えるのは非常に簡単で、タイプするのも比較的簡単です。
Avahi-daemonのような一部のプロセスは、プロセス名の情報を角かっこで追加し(avahi-daemonの場合はホスト名)、このコマンドによって除外されます。
カーネルプロセスを認識する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
出力をフィルタリングします。間違いのないオプションではありません。
ps
の出力を解析して、括弧内にないプロセス名を探すこともできます。
ps aux | awk '$NF!~/^\[.+\]$/'
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
あなたが探しているのは、私の友人です、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
を使用するのが簡単な方法です)、確認できます。
カウントのみが必要な場合...カーネル対ユーザープロセスを同様にフィルタリングする必要がありましたが、それぞれのカウントのみが必要でした。これは私の解決策でした:
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]の値(つまり、カウント)にラベルを付けて出力します。