Як змусити запустити лише користувача, 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"
pratnala

Не пробував. Знайшов це в мережі. Зараз поблизу машини Ubuntu. Вибачте. Побачимо пізніше і повідомимо
пратнала

Ні, я отримую ПОМИЛКУ: Невідомий варіант gnu long. Це працює на вас?
Bentley4

Відповіді:


13

Я думаю, ви шукаєте аргумент -o:

-о формат:

визначений користувачем формат. формат - це єдиний аргумент у вигляді списку, розділеного порожнім або розділеним комами, який пропонує спосіб вказати окремі вихідні стовпці. Розпізнані ключові слова описані у розділі СТАНДАРТНІ ФОРМАТИ-СПЕЦИФІЄРИ нижче. Заголовки можуть бути перейменовані (ps -o pid, ruser = RealUser -o comm = Команда) за бажанням. Якщо всі заголовки стовпців порожні (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
виконую

Так, це працює для мене в ksh під OpenSolaris. Вихід є за вашим бажанням ... Перевірте підручні сторінки на ps у вашій системі man ps. Можливо, у вашій системі синтаксис трохи відрізняється.
Саймон

1
Але ОП на баш, а не на
кш

1
@ Bentley4 Якщо ви просто хочете команду і вам не потрібна додаткова інформація, можете скинути аргумент -f і скористатися такою командою:ps -o uid,pid,cmd -e|grep python
Simon

1
@ Bentley4:ps -o user,pid,cmd -e|grep '[p]ython'
Simon

3

Можливо, найпростішим було б:

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

Таким чином ви отримуєте все безпосередньо з psі не потрібно нічого розбирати.

На psчоловіковій сторінці:

-формат

визначений користувачем формат. формат - це єдиний аргумент у вигляді списку, розділеного порожнім або розділеним комами, який пропонує спосіб вказати окремі вихідні стовпці. [...] Заголовки можуть бути перейменовані (ps -o pid, ruser = RealUser -o comm = Команда) за бажанням. Якщо всі заголовки стовпців порожні (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 "" | вирізати -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.