1

Я получил требование отфильтровать результаты процесса в контексте пользователя. Я использую команду, как.

# top -b -n 1 -p $(pgrep -d',' http)
top - 14:44:13 up 7 days,  3:01,  6 users,  load average: 0.05, 0.01, 0.00
Tasks:   3 total,   0 running,   3 sleeping,   0 stopped,   0 zombie
Cpu(s):  1.0%us,  1.4%sy,  0.0%ni, 97.4%id,  0.1%wa,  0.0%hi,  0.1%si,  0.0%st
Mem:   8062112k total,  4471344k used,  3590768k free,   176040k buffers
Swap:  6160376k total,       88k used,  6160288k free,   797580k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND            
27720 root      20   0  175m 3708 1408 S  0.0  0.0   0:05.79 httpd              
27722 daemon    20   0  175m 3076  708 S  0.0  0.0   0:00.00 httpd              
27723 daemon    20   0 2417m 176m  13m S  0.0  2.2   0:43.19 httpd  

И я хочу получить «идентификатор процесса», который находится в пользовательском контексте «root».

3 ответа3

1

pgrep поддерживает фильтрацию по пользователю процесса:

pgrep -u root httpd

Если вы хотите вместо этого извлечь PID из вашего top вывода, попробуйте этот awk one-liner:

($NF=="httpd" && $2=="root") {print $1}

например

top -b -n 1 -p $(pgrep -d',' http) | 
  gawk '($NF=="httpd" && $2=="root") {print $1}'

Другой иногда полезный параметр pgrep - это -o для самого старого процесса сопоставления, который должен быть процессом прослушивателя httpd верхнего уровня (pgrep достаточно умен, чтобы попытаться сделать правильные вещи, когда совпадающие процессы имеют "одинаковое" время запуска).

Apache также обычно настроен на запись pid-файла, обычно где-то вроде /usr/local/apache2/logs/httpd.pid или /var/run/httpd.pid , который также должен содержать PID верхнего уровня (хотя он немного меньше заслуживает доверия, как это может быть несвежим).

0

В Linux, предполагая, что /proc доступен (если нет, возможно, у вас больше проблем с получением полного представления о запущенных процессах), вы можете получить PID всех процессов, принадлежащих root с помощью команды, подобной следующей:

find /proc -maxdepth 1 -type d -regex '^/proc/[1-9][0-9]*$' -uid 0 -print \
| sed 's,/proc/,,g'

Строго говоря, в нем будут перечислены все каталоги, расположенные непосредственно в /proc, которые имеют имя, начинающееся с ненулевой цифры, за которой следует любое количество цифр. Затем он использует sed для удаления /proc/ в начале каждой строки вывода, оставляя вас просто с числовыми PID.

Результат этого может быть далее передан любому процессу, который вам нравится; это будет просто список PID, по одному на строку. Например, вы можете направить вывод в цикл, как while read pid; do something $pid; done чтобы сделать something с каждым PID по очереди.

В моей системе выходные данные отсортированы по числовым параметрам, но я не думаю, что вы всегда можете рассчитывать на это. sort противном случае сортировка пригодится (и в зависимости от того, что вы хотите сделать, вас может особенно заинтересовать что-то вроде sort -rn для обратной числовой сортировки).

Часть -uid 0 может быть заменена для ссылки на любой числовой UID, который вы хотите (или обратитесь к странице find man для других возможностей; например, -gid). Если вы заинтересованы в своих собственных процессах, а не в root, вам пригодится что-то вроде id -u (-uid $(id -u)).

0

Лучшим инструментом для этого, вероятно, будет ps:

   ps displays information about a selection of the active
   processes.  If you want a repetitive update of the selection
   and the displayed information, use top(1) instead.

Соответствующие варианты здесь:

   -C cmdlist
          Select by command name.  This selects the processes
          whose executable name is given in cmdlist.
   -o format
          User-defined format.  format is a single argument in
          the form of a blank-separated or comma-separated list,
          which offers a way to specify individual output
          columns.  The recognized keywords are described in the
          STANDARD FORMAT SPECIFIERS section below. 

Итак, чтобы найти все процессы httpd , которые были запущены пользователем root:

$ ps -C httpd -o pid,user
  PID USER
27720 root
27722 daemon
27723 daemon

Теоретически. передача опции -u root в ps должна возвращать только те процессы, которые выполняются root но это не работает в моей системе, не знаю почему. Итак разбираем

$ ps -C httpd -o pid,user | gawk '$2==root{print $1}'
27720

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