Aplicativos (especialmente os grandes Java e C++) geralmente aparecem como várias linhas htop
, cada um com PID separado e nível agradável separado. Além disso, o aplicativo pode gerar muitos processos filhos (como em aptitude update
), então preciso afetar tanto o pai (para fazer com que os novos filhos tenham nova prioridade) quanto os filhos (para trazer o efeito imediatamente, não depois que o filho terminar)
Como posso aplicar "renice" ou "ionice" ou "schedtool" a um grande aplicativo já lançado?
Responder1
1) Obtenha o PID do processo superior e lembre-se dele.
2) Obtenha todos os processos com PPID de um PID lembrado e lembre-se de seus PIDs
3) repita o passo 2 até que não haja novos PIDs.
4) Para cada PID, aplique o comando a esse processo.
Não deve ser muito difícil no seu idioma favorito.
Responder2
Não tenho uma solução totalmente robusta, mas em muitos casos o conjunto de processos alvo será um grupo de processos. Se $parent
for o pid do processo pai, o comando a seguir lista os pids dos processos no grupo:
ps -eo pgrp:1=,pid:1= |sed -n "s/^$parent //p"
Responder3
Eu sei que isso é um pouco antigo, mas como foi isso que surgiu quando procurei a mesma coisa, resolvi postar minha solução (também postado nesta essência caso eu atualize)
#!/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
}
Responder4
sudo renice -n num $(pidof processname)