2

Я знаю аргумент "-C", который может фильтровать по команде.

Но в моем сценарии у меня могут быть некоторые процессы с одинаковым именем процесса и разными аргументами.

Как отфильтровать по этим аргументам?

(Я знаю, что смогу потом перейти к grep, но это не на 100% точно. То есть: когда аргумент может содержать другой аргумент, например, если я хочу фильтровать по аргументу "bar" в этом списке:

+---------+---------+-----------+
| Process | Command | Arguments |
+---------+---------+-----------+
| 23      | foo     | bar       |
| 48      | foo     | barbaz    |
+---------+---------+-----------+

PS: я предполагаю, что большинство ответов порекомендуют мне использовать "pgrep" вместо "ps", но я хотел бы избежать этого, если это возможно.

2 ответа2

2

Я не верю, что такая опция существует - по крайней мере, она не существует в моей версии ps . Я сомневаюсь, что во многих реализациях ps есть такая опция - имя команды довольно просто определить, что, безусловно, не относится к аргументам команды.

В любом случае философия Unix состоит в том, чтобы объединить множество простых инструментов (например, ps и grep) для выполнения более сложных задач. Можно утверждать, что даже ps -C толкает его - на самом деле я считаю, что у MacOS X ps такой опции нет.

Что именно ты пытаешься сделать? Каков контекст вашего вопроса? Потому что, по моему опыту, в 99% случаев, когда люди автоматизируют вещи, анализируя вывод ps они делают то, что делают неправильно ...

1

Я не думаю, что вы можете достичь этого, используя только ps . Вы правы в том, что фильтрация с использованием grep не идеальна, но если вы хотите дать pgrep шанс, вы можете приблизиться к вашему требованию с помощью:

ps -p $(pgrep -f bar -d',')

Опция -f заставляет pgrep поиск по всей командной строке (а не только по имени процесса), а опция -d указывает разделитель, который используется для объединения пидов.

Таким образом, передача списка pid в ps ограничивает вывод теми, которые содержат ключевое слово в полной команде (включая аргументы).

В вашем примере, где вы хотите сопоставить "foo bar", но не "foo barbaz", вы ищете точное совпадение с:

ps -p $(pgrep -f "foo bar$" -d',')   # Note the eol anchor '$'

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .