`ps`のいくつかの条件で選択する方法はありますか?


12

私は盲目的に明白な何かが欠けているようですが、それでも:

ps -f -u myuser --ppid 1

プロセスの親pidのみを確認しているように見え、ユーザーがいない場合でも、親pidが1であるすべてのプロセスを返しますmyuser

-u正しく単体作品(のプロセスだけを選択myuser)を:

ps -f -u myuser

何が欠けていますか?のいくつかの条件でフィルタリングする組み込みの方法はありpsますか?

編集: 私の現在の回避策:

ps -f -p $(join <(ps h --ppid 1 -o pid | sort) <(ps h -u myuser -o pid | sort))

回答:


12

psそのように迷惑です。幸いなことに、pgrep同様の選択オプションがあるがありますが、すべてを一致させる必要があり、一致するPIDを出力します。デフォルトでは、1行に1つ出力しますが、次のように機能するように別の区切り文字を使用するように要求できますps

ps -f -p"$(pgrep -d, -u $USER -P 1)"

4

残念ながらps、選択を解除することしかできませんand。演算子も、絞り込みを追加する機能もないようです。

pgrepPIDのリストを取得し、それをフィードするためにのヘルプを利用できpsます。例えば:

$ ps -f $(pgrep -P 1 -u saml)
UID        PID  PPID  C STIME TTY      STAT   TIME CMD
saml      1986     1  0 Jul25 ?        SLl    0:00 /usr/bin/gnome-keyring-daemon --daemonize --login
saml      2003     1  0 Jul25 ?        S      0:00 dbus-launch --sh-syntax --exit-with-session
saml      2004     1  0 Jul25 ?        Ss     0:23 /bin/dbus-daemon --fork --print-pid 5 --print-address 7 --session
saml      2147     1  0 Jul25 ?        S      0:04 /usr/libexec/gconfd-2
saml      2156     1  0 Jul25 ?        Ssl    0:09 /usr/libexec/gnome-settings-daemon
saml      2162     1  0 Jul25 ?        S      0:00 /usr/libexec/gvfsd
saml      2178     1  0 Jul25 ?        Ssl    0:01 /usr/bin/pulseaudio --start --log-target=syslog
saml      2180     1  0 Jul25 ?        Ssl    0:04 /usr/libexec//gvfs-fuse-daemon /home/saml/.gvfs
saml      2191     1  0 Jul25 ?        S      0:12 syndaemon -i 0.5 -k
saml      2193     1  0 Jul25 ?        S      0:00 /usr/libexec/gvfs-gdu-volume-monitor

2

ps非常に柔軟なフィルターはありません。必要以上に表示し、形式を明示的に指定して、出力をフィルタリングします。多くの場合、Awkはこのタスクに適しています。

ps -o pid= -o ppid= -o user= -o comm= -o args= |
awk -v uid="$(id -un myuser)" '$2 == 1 && $3 == uid'

列名の後の等号は、ヘッダー行を抑制します。ヘッダー行を表示する場合は、フィルターに最初の行を変更せずに出力させます。

ps -o pid -o ppid -o user -o comm -o args |
awk -v uid="$(id -un myuser)" 'NR == 1 || ($2 == 1 && $3 == uid)'

自動処理を行う場合は、データをPIDのみにストリップする必要があります。

ps -o pid= -o ppid= -o user= |
awk -v uid="$(id -un myuser)" '$2 == 1 && $3 == uid {print $1}'

0

私はバッチによって開始されたPIDを確認する必要があったので、PIDとPPIDを確認する必要がありました。このgrepは私にとってより便利でした。

grep -c $$ /proc/CHILDPID/stat
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.