Linux / Bash, использующий PS -f для определенных возвратов PID в другом формате, чем PS -f, также задает вопрос об использовании Grep для анализа этого - PullRequest
3 голосов
/ 24 сентября 2010

Мне нужно, чтобы скрипт Python, который я создаю, сначала получил только PID процесса (на основе его имени), а затем получил от этого процесса, используя его PID, его продолжительность, которая,из распечатки ниже, будет "00:00:00"

root      5686     1  0 Sep23 ?        00:00:00 process-name

Я использую это, чтобы получить только PID, по имени процесса:

ps -ef |grep `whoami`| grep process-name | cut -c10-15

Итак, этоработает нормально, и я предполагаю, что параметры среза (-c10-15) будут работать универсально, так как расположение PID не должно измениться (я только что получил это из фрагмента, который я нашел)

Однако, когда япопробуйте сделать что-то похожее, чтобы получить только значение ВРЕМЕНИ, например, оно возвращает его по-другому

ps -f 5686

возвращает:

root      5686     1  0 Sep23 ?        S      0:00 /path/to/process

Поэтому, когда я пытаюсь вырезать, как показано нижене думаю, что это будет работать должным образом, так как я не уверен, что интервал в этом возвращении является постоянным, а также показывает, что значение времени отличается от предыдущего (не оригинального стиля распечатки "00:00:00".

ps -f 5686 | cut -c40-47

Я использую это в своем скрипте Python для записи PID спецификации.Тип процесса fic (по имени), чтобы впоследствии я мог закрыть этот экземпляр программы при необходимости.Любые советы о том, что я могу сделать, чтобы исправить свой подход, приветствуются

Ответы [ 3 ]

3 голосов
/ 24 сентября 2010

Используйте параметр -o для управления тем, какие данные выводятся и в каком порядке.

, например

$ ps -o pid,time,comm
  PID     TIME COMMAND
 3029 00:00:01 zsh
22046 00:00:00 ps

или

$ ps -o pid,time,comm --no-headers
 3029 00:00:01 zsh
22046 00:00:00 ps

Это облегчит анализ. Я бы предложил разобрать вывод с помощью python, используя (pid, time, cmd) = result.split(2)

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

0 голосов
/ 24 сентября 2010

Если вы хотите согласованное представление времени процессора, прочитайте /proc/<pid>/stat и прочитайте поля utime и stime.

Считайте man 5 proc, чтобы получить полный макет этого файла, ноЛегкий бит в том, что вам нужны 14-е и 15-е значения, и они представлены в «jiffies» (обычно 100 в секунду), например,

% ps -e 2398
2398 ?        00:04:29 ypbind

00: 04: 29 составляет 269 секунд

% awk '{ print ($14 + $15) / 100 }' < /proc/2398/stat
269.26

или в скрипте Bash без запуска подпроцесса:

#!/bin/sh
read -a procstat /proc/pid/stat
let cpu=(procstat[13] + procstat[14]) / 100
0 голосов
/ 24 сентября 2010

Как насчет использования

ps ux | awk '/$PROCESS_NAME/ && !/awk/ {print $2, $10}'

Это должно дать вам PID и ВРЕМЯ (адаптировано с здесь )

EDIT:
Версия с -ef

ps -ef | awk '/$PROCESS_NAME/ && !/awk/ {print $2, $7}'
...