Я искал везде и ничего об этом не нашел. Я пытаюсь создать небольшую шкалу, которая показывает использование ЦП одного процесса, указанного в 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);
по-прежнему нет результата, ничего не отображается
Хотя на вопрос уже дан ответ и он принят, я считаю его неполным. В принятом ответе отсутствует несколько моментов.
Вам нужно запустить top в пакетном режиме с помощью -b, если вы запускаете его как дочерний процесс и хотите получить любой значимый вывод. В противном случае он будет иметь сочетание управляющих символов в результате работы в интерактивном режиме.
Укажите количество итераций, которое вы хотите, используя -n, иначе это приведет к бесконечной итерации, и дочерний процесс никогда не завершится. У вас должно быть как минимум две итерации, чтобы у вершины была контрольная точка для сбора разницы, которая является фактическим использованием ЦП.
Укажите интервал между итерациями с помощью -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