3

Приложения (особенно большие на Java и C++) часто отображаются в виде нескольких строк в htop , каждая из которых имеет отдельный PID и отдельный приятный уровень. Кроме того, приложение может порождать множество дочерних процессов (как, например, в aptitude update), поэтому мне нужно воздействовать как на родительский (чтобы новые дочерние объекты получили новый приоритет), так и на дочерние (чтобы эффект был получен немедленно, а не после завершения дочернего процесса).

Как применить "renice", "ionice" или "schedtool" к уже запущенному большому приложению?

5 ответов5

1

1) Получить PID самого верхнего процесса и запомнить его.

2) Получить все процессы с PPID запомненного PID и запомнить их PID

3) повторять шаг 2 до тех пор, пока не появятся новые PID.

4) Для каждого PID примените команду к этому процессу.

Не должно быть слишком сложно на вашем любимом языке.

1

Я знаю, что это немного устарело, но поскольку это то, что возникло, когда я искал ту же вещь, я решил опубликовать свое решение (также опубликованное в этой сущности на случай, если я обновлю его)

#!/usr/bin/env bash

# This can be run simply by passing it the outputs from pgrep:
# my_renice $(pgrep application)
#
# You may also want to use pgrep to find more complex 
#    processes based on arguments
# my_renice $(pgrep -f "bash.*$name")

function my_renice(){
  newnice=10
  pid=$1

  # Return if pid not found
  if [ -z $pid ]; then return; fi

  # Renice pid right away in case we spawn more children
  renice $newnice $pid

  # Find children pids
  children=$(pgrep -d ' ' -P $pid)

  # Loop through children
  for i in $children; do my_renice $i; done
}
1

У меня нет полностью надежного решения, но во многих случаях набор целевых процессов будет группой процессов. Если $parent - это pid родительского процесса, следующая команда перечисляет pid процессов в группе:

ps -eo pgrp:1=,pid:1= |sed -n "s/^$parent //p"
0

Обратите внимание, что добротность процессора наследуется дочерними процессами. Так что просто возродите родителя (или начните с помощью nice); дочерние процессы получат ту же милость.

Если дети уже бегут, когда вы делаете это, вам, конечно, придется брать их отдельно. Но на практике я обнаружил, что обычно только несколько процессов действительно нагружают процессор; Я возбуждаю их и родительский процесс.

-1
sudo renice -n num $(pidof processname)

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