Назад | Перейти на главную страницу

Получите в реальном времени использование ЦП процессом Linux с помощью однострочной команды и в качестве простого результата

Я искал везде и ничего об этом не нашел. Я пытаюсь создать небольшую шкалу, которая показывает использование ЦП одного процесса, указанного в PID.

Мне нужна команда для вывода простого ответа, поэтому top -p $ pid не подходит. Команда выполняется PHP и должна немедленно распечатать ответ.

То, что тесно связано с тем, что мне нужно, это

sudo ps -p $pid -o %cpu

Но после тестирования и еще нескольких поисков я обнаружил, что это среднее значение использования с момента запуска процесса. Мне нужно использование в реальном времени с момента запуска команды si, как показано наверху.

Это возможно?

редактировать::

$cmd = 'sudo sh -c "top -n1 | awk \'/30100/ {print $9}\'"';
echo exec($cmd);

пробовал без оболочки

$cmd = "sudo top -n1 | awk '/30100/ {print $9}'";
echo exec($cmd);

по-прежнему нет результата, ничего не отображается

Хотя на вопрос уже дан ответ и он принят, я считаю его неполным. В принятом ответе отсутствует несколько моментов.

  1. Вам нужно запустить top в пакетном режиме с помощью -b, если вы запускаете его как дочерний процесс и хотите получить любой значимый вывод. В противном случае он будет иметь сочетание управляющих символов в результате работы в интерактивном режиме.

  2. Укажите количество итераций, которое вы хотите, используя -n, иначе это приведет к бесконечной итерации, и дочерний процесс никогда не завершится. У вас должно быть как минимум две итерации, чтобы у вершины была контрольная точка для сбора разницы, которая является фактическим использованием ЦП.

  3. Укажите интервал между итерациями с помощью -d. В большинстве систем значение по умолчанию составляет 3 секунды. Поэтому, если вы хотите использовать посекундное использование, вам нужно указать его явно.

Теперь объединив все вышеперечисленные пункты, вы получите

top -b -n 2 -d 1

Поскольку у нас две итерации, нам нужно рассматривать только второй результат. Используйте awk для получения второго вывода, который начинается со строки верхняя.

top -b -n 2 -d 1 | awk '/^top/{i++}i==2'

Теперь давайте отфильтруем PID, скажем 2593, и распечатаем 9-й столбец, который содержит использование ЦП. Учитывайте только выходные строки, которые начинаются с PID.

top -b -n 2 -d 1 | awk '/^top/{i++}i==2' | awk '/^\s*2593/ {print $9}'

Что ж, я бы начал с такого наивного подхода:

$ top |grep %pid

В ubuntu 12.04 он выводит строку для PID один раз за обновление вершины:

    username@usrver / $ top |grep 2593
 2593 username   20   0 1103m 170m  16m S   30  2.2  67:25.38 chrome             
 2593 username   20   0 1103m 170m  16m S   28  2.2  67:26.24 chrome             
 2593 username   20   0 1103m 170m  16m S   30  2.2  67:27.15 chrome             
 2593 username   20   0 1103m 170m  16m S   23  2.2  67:27.86 chrome             
 2593 username   20   0 1103m 170m  16m S   25  2.2  67:28.60 chrome

Затем возьмите 10-е поле с помощью awk, хотя на самом деле нам здесь не нужно использовать grep. awk может использовать регулярное выражение для вашего PID, а затем распечатать значение ЦП:

username@usrver / $ top | awk '/2593/ {print $10}'
25
29
30
32