Приложения (особенно большие Java и C++) часто отображаются в виде нескольких строк в htop
, каждое из которых имеет отдельный PID и отдельный nice level. Также приложение может порождать множество дочерних процессов (как в aptitude update
), поэтому мне нужно повлиять как на родительский (чтобы новые дочерние процессы имели новый приоритет), так и на дочерние (чтобы эффект проявился немедленно, а не после завершения дочернего процесса)
Как применить «renice», «ionice» или «schedtool» к уже запущенному большому приложению?
решение1
1) Получите PID самого верхнего процесса и запомните его.
2) Получить все процессы с PPID запомненного PID и запомнить их PID
3) повторяйте шаг 2 до тех пор, пока не останется новых PID.
4) Для каждого PID примените команду к этому процессу.
На вашем любимом языке это не должно быть слишком сложно.
решение2
У меня нет полностью надежного решения, но во многих случаях набор целевых процессов будет группой процессов. Если $parent
это pid родительского процесса, следующая команда выводит список pid процессов в группе:
ps -eo pgrp:1=,pid:1= |sed -n "s/^$parent //p"
решение3
Я знаю, что это немного устарело, но поскольку это то, что появилось, когда я искал то же самое, я решил опубликовать свое решение (также опубликовано в этом gist на случай, если я его обновлю)
#!/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
}
решение4
sudo renice -n num $(pidof processname)