OR ではなく AND 句を使用して ps を実行する

OR ではなく AND 句を使用して ps を実行する

特定のプロセスが特定のユーザーとして実行されているかどうかを確認したいのですが、そのためには次のようにします。

ps --no-headers -C command -o user | grep user

これはかなり便利ですが、引数を印刷したい場合、少し見苦しくなります (ユーザー名の grep に干渉する可能性があります)。

ps --no-headers -C command -o user,pid,comm | egrep \^user

ユーザを最初の列や最後の列にしたくない場合は、さらに面倒になります。PS で -C および -U オプションを次のように指定できれば、もっとすっきりします。

ps --no-headers -C command -U user -o pid

ただし、2 つの句が AND ではなく OR として機能するため、これは機能しません。私が見逃している 'ps' の機能があるのでしょうか、それとも別の便利なワンライナーを使用できるのでしょうか。よろしくお願いします。

答え1

pgrepさまざまな条件をサポートします:

pgrep -x -u "user" "command"

引数も一致させるには を-x置き換え、コマンド ラインを表示するには を追加します。-f-l

コマンドラインを直接読み取ることもできます(null 区切り):/proc/PID/cmdline

if pids=$(pgrep -x -u "user" "command"); then
    for pid in $pids; do
        tr "\0" " " < /proc/$pid/cmdline; echo
    done
fi

関連情報