Как заставить работать только пользователя, pid и команду для определенного процесса? (Ubuntu 11.10)


19

Когда я 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

Это работает? ps --fields="user pid command"
Пратнала

Не пробовал. Нашел это в сети. Не возле машины с Ubuntu. Сожалею.
Увидимся

Нет, я получаю сообщение об ошибке: Неизвестный вариант GNU Long. Работает ли это для вас?
Bentley4

Ответы:


13

Я думаю, вы ищете аргумент -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
Это на самом деле работает для вас? Когда я запускаю эту команду, я получаюWarning: bad ps syntax, perhaps a bogus '-'? See http://procps.sf.net/faq.html
Bentley4

Да, у меня это работает в ksh под OpenSolaris. Вывод по вашему желанию ... Проверьте справочные страницы для ps в вашей системе man ps. Возможно, синтаксис немного отличается в вашей системе.
Симон

1
Но ОП на bash, а не на ksh
pratnala

1
@ Bentley4 Если вам нужна только команда и вам не нужна дополнительная информация, вы можете удалить аргумент -f и использовать следующую команду:ps -o uid,pid,cmd -e|grep python
Simon

1
@ Bentley4:ps -o user,pid,cmd -e|grep '[p]ython'
Саймон

3

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

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

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

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

-o формат

Определяемый пользователем формат. Формат - это отдельный аргумент в виде списка, разделенного пробелами или запятыми, который позволяет указать отдельные выходные столбцы. [...] Заголовки могут быть переименованы (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 в зависимости от того, чего вы пытаетесь достичь) - например, что-то вроде

пс эф | вырезать -c1-16,50-   

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

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

пс эф | tr -s "" | cut -f1,2,8- -d ""

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


Только для одного процесса я получаю половину страницы информации на весь экран с этими командами. Это довольно нечитаемо, я «массирую» параметры, но пока не смог получить что-то удаленно от того, что я хочу.
Bentley4

1
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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.