17

Когда я делаю ps -ef|grep python я получаю следующее:

myusername  4492  2994  0 10:32 pts/0    00:00:01 /home/myusername/.virtualenvs/myproject/bin/ipython manage.py runserver
root        6665     1  0 10:42 ?        00:00:00 /usr/bin/python /usr/lib/system-service/system-service-d
myusername 14051 13497  0 11:28 pts/7    00:00:00 grep --color=auto python

Как получить только пользователя, который запускает процесс, pid и команду, запущенные для процесса, как показано в следующем выводе?

myusername  4492 /home/myusername/.virtualenvs/myproject/bin/ipython manage.py runserver
root        6665 /usr/bin/python /usr/lib/system-service/system-service-d

4 ответа4

12

Я думаю, вы ищете аргумент -o:

-о формат:

определяемый пользователем формат. Формат - это отдельный аргумент в виде списка, разделенного пробелами или запятыми, который позволяет указать отдельные выходные столбцы. Распознанные ключевые слова описаны ниже в разделе СТАНДАРТНЫЕ ФОРМАТЫ. Заголовки могут быть переименованы (ps -o pid, ruser = RealUser -o comm = Command) по желанию. Если все заголовки столбцов пусты (ps -o pid = -o comm =), строка заголовка не будет выведена. Ширина столбца будет увеличиваться по мере необходимости для широких заголовков; это может быть использовано для расширения столбцов, таких как WCHAN (ps -o pid, wchan = WIDE-WCHAN-COLUMN -o comm). Также предлагается явное управление шириной (ps opid, wchan:42, cmd). Поведение ps -o pid = X, comm = Y зависит от личности; выходные данные могут быть одним столбцом с именем «X, comm = Y» или двумя столбцами с именами "X" и "Y". Используйте несколько опций -o, если сомневаетесь. Используйте переменную окружения PS_FORMAT, чтобы указать желаемое значение по умолчанию; DefSysV и DefBSD - это макросы, которые можно использовать для выбора столбцов UNIX или BSD по умолчанию.

Итак, команда, которую вы хотите, будет (Ubuntu):

ps -o uid,pid,cmd -ef|grep python

под OpenSolaris команда выглядит так:

ps -o ruser,pid,comm -ef|grep python
3

Самым простым, вероятно, будет:

$ ps o uid=,pid=,cmd= -C python
1000 26126 python

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

Со страницы руководства ps :

-о формат

Пользовательский формат. Формат - это отдельный аргумент в виде списка, разделенного пробелами или запятыми, который позволяет указать отдельные выходные столбцы. [...] Заголовки могут быть переименованы (ps -o pid, ruser = RealUser -o comm = Command) по желанию. Если все заголовки столбцов пусты (ps -o pid = -o comm =), строка заголовка не будет выведена.

-C cmdlist
     Select by command name.  This selects the processes whose executable 
     name is given in cmdlist.

Опция -C будет работать, если вы запускаете python интерактивном режиме, а не если python запускает скрипт. В этом случае вы должны использовать вместо -C scriptname.py .

1

Моя версия PS отличается, поэтому может потребоваться некоторая настройка, но вы можете использовать cut (и, возможно, tr в зависимости от того, чего вы пытаетесь достичь) - например, что-то вроде

ps ef | cut -c1-16,50-   

Предоставит символы 1-16 и 50 и далее от каждой строки вашего заявления PS. (Ваши реальные цифры, вероятно, потребуется немного помассировать).

Другой способ сделать это (но вы потеряете форматирование) может быть

ps ef | tr -s " " | cut -f1,2,8- -d" "

Который сожмет пробел в команде ps, затем возьмет поля 1,2 и 8 и отобразит их.

0
ps -eo user,pid,cmd | grep [p]ython

Пример:

$ ps -eo user,pid,cmd | grep [p]ython
root      1056 /usr/bin/python3 /usr/bin/networkd-dispatcher --run-startup-triggers
root      1735 /usr/bin/python3 /usr/bin/fail2ban-server -xf start
bmaupin  16613 /usr/bin/python3 /usr/share/system-config-printer/applet.py

Объяснение:

  • -e все процессы
  • -o определяемый пользователем формат
  • user,pid,cmd Показать пользователя, идентификатор процесса, столбцы команд

Примечание: если вы используете -f с -e как предлагали другие, вы можете получить ошибки. Это связано с тем, что оба эти параметра управляют форматом вывода, и должен использоваться только один из них:

$ ps --help | grep -A 2 "output format"
*********** output format **********
-o,o user-defined  -f full
-j,j job control   s  signal

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