Linux / Comando renice: alterar NI de um processo em execução

renice altera o valor nice de um processo que já está em execução. Depois de conferir o identificador do processo, o PID, e seu comando, você pode reduzir sua prioridade relativa de CPU aumentando esse valor.

O valor nice influencia o agendamento do tempo do processador, a CPU. Ele não reduz a memória usada nem encerra o programa. Para iniciar um novo comando com outro valor, use nice e seu ajuste relativo; renice atua em um processo que já existe.

Sintaxe e diferença entre valor e incremento

renice --priority valor -p PID...

Esta sintaxe usa renice do util-linux com a opção --priority, que define um valor absoluto. Por exemplo, definir 10 em um processo que tem NI 5 resulta em NI 10, se a operação for permitida; não soma 10 para chegar a 15. Confira type renice, renice --version, renice --help e man renice na instalação usada antes de aplicar os exemplos.

A opção curta -n merece atenção: no util-linux, ela usa um valor absoluto quando a variável de ambiente POSIXLY_CORRECT não está definida, mas passa a representar um incremento quando essa variável está definida. A forma --relative escolhe explicitamente o incremento. Para evitar depender desse contexto, os comandos de alteração abaixo usam --priority. Se a versão instalada não oferecer essa opção, confira seu manual em vez de substituir a sintaxe automaticamente.

Essa diferença está documentada tanto no manual do renice do util-linux quanto na página do renice no Debian testing. Outros sistemas e implementações podem seguir regras diferentes.

Conferir um PID antes e depois do ajuste

Os três exemplos curtos são modelos para Linux com ps do procps. Substitua 1234 pelo PID real de um processo seu que possa ser ajustado e faça as consultas na mesma sequência. Primeiro, confira o comando, o usuário mostrado e a coluna NI, que contém o valor nice:

ps -p 1234 -o pid,user,ni,cmd

Não prossiga se o processo não for o esperado, já tiver terminado ou você não tiver autorização para ajustá-lo. Uma listagem de ps ajuda a conferir o alvo, mas não bloqueia a identidade do PID: o processo pode terminar e o número pode ser reutilizado depois da consulta.

Com o alvo confirmado, a forma explícita para definir NI 10 é:

renice --priority 10 -p 1234

Esse comando define 10; não é a mesma operação que acrescentar 10 com nice -n. Também não garante que a aplicação ficará dez vezes mais lenta ou limitada a certa porcentagem de CPU. Confira a mensagem do comando e consulte o resultado:

ps -p 1234 -o pid,ni,cmd

Se o ajuste for permitido e o processo ainda existir, NI deve refletir o valor solicitado. Se houver erro de permissão, processo ausente ou opção não reconhecida, não considere a alteração concluída. O guia de ps e consulta de processos explica os campos e os limites da seleção.

Prática limitada a um processo de teste

O exemplo completo exige Bash, sleep, renice do util-linux com --priority e ps compatível com as opções do procps no Linux. Execute-o sem set -e. Ele cria apenas uma espera de oito segundos, guarda imediatamente seu PID em $!, verifica o valor inicial e altera somente esse filho. A espera termina naturalmente; a rotina EXIT também aguarda o filho caso uma verificação interrompa a sequência.

(
  for renice_demo_tool in renice ps sleep; do
    command -v "$renice_demo_tool" >/dev/null || exit 1
  done
  sleep 8 &
  renice_demo_pid=$!
  case "$renice_demo_pid" in ''|*[!0-9]*|0) exit 1 ;; esac
  trap 'wait "$renice_demo_pid" 2>/dev/null' EXIT
  sleep 0.2
  ps -p "$renice_demo_pid" -o pid,user,ni,comm || exit 1
  renice_demo_before=$(ps -p "$renice_demo_pid" -o ni=) || exit 1
  renice_demo_before=${renice_demo_before//[[:space:]]/}
  [[ "$renice_demo_before" =~ ^-?[0-9]+$ ]] || exit 1
  if (( renice_demo_before > 10 )); then
    printf '%s\n' 'NI maior que 10: teste interrompido sem ajuste.'
    exit 1
  fi
  renice --priority 10 -p "$renice_demo_pid"
  renice_demo_adjust_status=$?
  ps -p "$renice_demo_pid" -o pid,ni,comm
  renice_demo_ps_status=$?
  wait "$renice_demo_pid"
  renice_demo_wait_status=$?
  trap - EXIT
  printf 'renice=%s ps=%s wait=%s\n' "$renice_demo_adjust_status" "$renice_demo_ps_status" "$renice_demo_wait_status"
)

Quando o valor inicial for 0 e a alteração funcionar, a primeira consulta deve mostrar NI 0 e a segunda, NI 10. Um valor inicial diferente de 0 muda a primeira linha; se já for maior que 10, o bloco interrompe a prática sem tentar aumentar a prioridade. O formato da mensagem produzida por renice varia conforme a versão.

Com as consultas compatíveis e o filho terminando normalmente, o resumo esperado é renice=0 ps=0 wait=0. São resultados esperados para a prática Linux, não uma medição de desempenho. Se o processo terminar antes da consulta, ela pode não mostrar uma linha; analise também as mensagens de erro e os estados separados.

No ambiente disponível, Bash 5.3.9 do Git para Windows, renice não foi encontrado: as consultas de versão e ajuda retornaram 127. A execução do bloco parou na checagem inicial com retorno 1, antes de criar o filho. Sua sintaxe foi aceita pelo Bash, mas nenhuma alteração de NI, seleção de usuário ou grupo, ou política de um kernel Linux foi executada e confirmada ali.

A prática usa um PID positivo guardado em uma variável e espera pelo próprio filho. Isso evita depender de um número fixo de exemplo ou aplicar -u e -g durante o teste. A consulta anterior ao ajuste continua sem ser uma operação atômica com a alteração; use um processo controlado que permaneça ativo durante a sequência.

Opções e alcance dos alvos

Opção Significado no util-linux documentado
--priority valor Define um valor nice absoluto.
--relative incremento Soma um incremento ao valor nice existente.
-n valor Usa valor absoluto ou incremento conforme POSIXLY_CORRECT; deve ser o primeiro argumento quando utilizado.
-p PID Interpreta os identificadores seguintes como PIDs.
-u usuário Seleciona por nome de usuário ou UID e pode alcançar vários processos.
-g PGID Seleciona por identificador de grupo de processos e pode alcançar todos os processos desse grupo.

PGID é um identificador de grupo de processos; não é o grupo de usuários usado nas permissões de arquivos. Em um comando com vários identificadores, confira o alcance de cada seletor e cada mensagem de resultado. Não trate uma operação sobre usuário ou grupo como se fosse equivalente a um único PID confirmado.

Permissões e possibilidade de desfazer

Um usuário sem privilégios normalmente só pode ajustar processos próprios e aumentar o valor nice, reduzindo a prioridade relativa. Voltar de 10 para 0 significa aumentar a prioridade e pode ser recusado, mesmo que tenha sido você quem fez a primeira alteração. Um limite de recurso apropriado, RLIMIT_NICE, pode permitir determinados ajustes; privilégios como a capacidade CAP_SYS_NICE também afetam essa autorização.

O manual das interfaces getpriority e setpriority do Linux detalha as permissões. Se precisar restaurar um valor, registre antes o valor original e confirme a autorização para voltar a ele. A prática com sleep evita depender dessa reversão: o processo é temporário e termina por conta própria.

No Linux, o valor nice é um atributo por thread, ou linha de execução. Em um programa com várias threads, não suponha que ajustar um PID prove que todas receberam o mesmo valor. Para um diagnóstico desse tipo, confira as threads e a forma como o programa foi criado; o exemplo com sleep trata um caso simples.

O que uma mudança de NI não resolve

Renice não define uma porcentagem máxima de CPU nem diminui a memória alocada. Seu efeito depende dos trabalhos concorrentes, da política de agendamento e dos grupos de controle de recursos, os cgroups. O manual de agendamento do Linux explica essas condições, incluindo o agrupamento automático de sessões.

Se o programa estiver esperando disco, rede ou memória, mudar NI pode não resolver o gargalo. Observe o comportamento depois do ajuste e confirme a necessidade da mudança; um NI diferente, sozinho, não comprova que o tempo total do trabalho melhorou.

Pergunta frequente

Qual é a diferença entre nice e renice?

Nice inicia um novo comando com um ajuste no valor herdado. Renice altera um processo que já existe e, no util-linux, permite escolher explicitamente um valor absoluto com --priority ou um incremento com --relative. Confira a implementação e o alvo antes de aplicar a mudança.