非常に明白なものが欠けているようですが、まだ次のようになります。
ps -f -u myuser --ppid 1
プロセスの親pidのみを見て、ユーザーが1でない場合でも、親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))
答え1
ps
それは迷惑です。幸いなことに、pgrep
同様の選択肢がありますが、すべて一致する必要があり、一致するpidを出力することがあります。デフォルトでは1行に1つずつ出力されますが、使用できるように別の区切り文字を要求できますps
。
ps -f -p"$(pgrep -d, -u $USER -P 1)"
答え2
残念ながら、選択解除のみがあるだけで、演算子や改善機能を追加する機能はps
ないようです。and
pgrep
PIDのリストを入手してそれを提供するために助けを求めることができます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
答え3
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}'
答え4
バッチ開始のPIDを確認する必要があるため、PIDとPPIDも確認する必要があります。このgrepは私にとってより便利です。
grep -c $$ /proc/CHILDPID/stat