Приложения (особенно большой Java и C++) часто обнаруживаются как несколько строк в htop
, каждый имеет отдельный PID и разделяет хороший уровень. Также приложение может породить много дочерних процессов (как как в aptitude update
), таким образом, я должен влиять оба, порождают один (чтобы заставить новых детей иметь новый приоритет) и дочерние (для обеспечения эффекта сразу, не после того, как ребенок завершает),
Как я могу применить "renice" или "ionice" или "schedtool" к уже запущенному большому приложению?
1) Получите PID самого верхнего процесса и помните это.
2) Получите все процессы с PPID помнившего PID и помните их PIDs
3) повторите шаг 2, пока не будет никаких новых PIDs.
4) Для каждого PID примените команду к тому процессу.
Не должно быть слишком трудным на Вашем любимом языке.
У меня нет полностью надежного решения, но во многих случаях набор целевых процессов будет группой процесса. Если $parent
pid родительского процесса, следующие списки команд pids процессов в группе:
ps -eo pgrp:1=,pid:1= |sed -n "s/^$parent //p"
Обратите внимание, что правильность ЦП наследована дочерними процессами. Таким образом, просто renice родитель (или запускают его использование nice
); дочерние процессы получат ту же правильность.
Если дети будут уже работать, когда Вы сделаете это, у Вас, конечно, будут к renice они отдельно. Но на практике я нашел, что обычно существует всего несколько процессов что действительно пожиратель ресурсов ЦП; я renice они и родительский процесс.