Запуск ps с предложениями как AND вместо OR

Запуск ps с предложениями как AND вместо OR

Я ищу, запущен ли определенный процесс под определенным пользователем. Для чего я могу сделать это

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

Это довольно удобно, однако становится немного некрасиво, если я затем захочу вывести аргументы (что может помешать grep для имени пользователя!)

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

Это было бы еще хуже, если бы я не хотел, чтобы пользователь был первым или последним столбцом. Было бы аккуратнее, если бы я мог указать опции -C и -U в PS, как это

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

Однако это не работает, так как два предложения действуют как ИЛИ, а не И. Есть ли какая-то функция 'ps', которую я упускаю, или, может быть, другой аккуратный однострочник, который я мог бы использовать? Ура!

решение1

pgrepподдерживает различные состояния:

pgrep -x -u "user" "command"

Замените -xна -f, чтобы также сопоставить аргументы; добавьте -lдля отображения командной строки.

Вы также можете прочитать командную строку напрямую (разделенную нулем):/proc/PID/cmdline

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

Связанный контент