Eu gostaria de iniciar um trabalho de linha de comando longo e complexo de CPU e E/S para ser feito em segundo plano enquanto estou usando o PC. Isso prejudicará a capacidade de resposta do sistema se eu executá-lo com prioridade normal. Como faço para iniciar um shell (sob o qual o trabalho será executado) da maneira como todos os processos foram executados nele e os processos executados teriam baixa prioridade?
relate perguntas
-
Existe uma maneira de fazer ls mostrar arquivos ocultos apenas para determinados diretórios?
-
Inicie/pare o serviço systemd usando o atalho de teclado [fechado]
-
Necessidade de algumas chamadas de sistema
-
astyle não altera a formatação do arquivo de origem
-
Passe o sistema de arquivos raiz por rótulo para o kernel do Linux
Para executar um comando em um processo com menor prioridade, seja esse comando um shell ou seu comando pesado (que também pode ser um script de shell), no Linux você pode fazer:
nice
é padrão,ionice
é específico do Linux.Para executar algum código shell, use
sh -c
como comando:nice
sozinho aumenta a gentileza em10
, você pode especificar um incremento diferente com a-n
opção.No
zsh
shell, você pode definir abgnice
opção (ativado por padrão quando interativo) para que todos os comandos executados em segundo plano tenham sua gentileza aumentada em 5.No
(t)csh
shell,nice
há um built-in que também pode alterar a gentileza do shell (cuidado que a sintaxe é diferente donice
comando padrão (nice +10 cmd
para especificar gentileza arbitrária (não incrementar!)) e a gentileza padrão é 4).Em shells que não suportam alterar sua própria gentileza por si mesmos, você pode usar
renice
. Cuidado querenice -n 5 "$pid"
atualmente é exigido pelo POSIX para diminuir a gentileza do processo de id$pid
em 5 , mas isso não é o que acontece em nenhuma implementação que eu conheço e é obviamente um bug na especificação POSIX¹. Na prática, ele define a gentileza para 5² ou aumenta em 5.Na prática,
renice -n 20 "$pid"
assumir que a gentileza não era negativa em primeiro lugar definiria a gentileza para o valor mais alto pelo menos no Linux.Observe que
nice
(introduzido no Unix V4 em meados dos anos 70) inicialmente não recebeu nenhum argumento numérico. Um argumento numérico foi adicionado independentemente no Unix V7 e no csh (BSD baseado em V6), mas feito de forma diferente. No V7,nice -5 cmd
aumentou a gentileza em 5 enquanto no csh (como visto acima), isso o definiria como-5
.renice
foi inicialmente de BSDs e foi consistente com csh'snice
(renice +5 "$pid"
para definir a gentileza para 5).Essa história explica porque hoje em dia, fora do
csh
,nice -5
aumenta a gentileza erenice -5
a diminui. Eu suspeito que-n
seja uma invenção do POSIX (como forhead -n
) introduzida para se livrar dos nomes das opções com o início+
e para tentar vir com uma API limpa (os valores de gentileza também não são portáteis, então faz mais sentido lidar com incrementos).A gentileza de E/S de outros processos arbitrários também pode ser alterada com
ionice
sua-p
opção.Então, de dentro do shell (shells do tipo Bourne aqui), você pode alterar a gentileza do processo que executou o interpretador de shell com:
Ou para alterar a gentileza do subshell atual:
No
bash
shell, você também pode obter o pid do subshell atual com$BASHPID
ezsh
com$sysparams[pid]
(depois dezmodload zsh/system
). Esteja ciente de que oksh93
shell não implementa ambientes de subshell com processos filhos, portanto, o acima afetaria a gentileza globalmente lá.¹ Isso foi introduzido no SUSv3 , a versão anterior (que também especificava a
renice
API original (como obsoleta)) dizia corretamente que um valor positivo diminuía a prioridade , não a gentileza² como na
util-linux
implementação. Isso é um erro .-n
foi adicionado em 2009 para conformidade com POSIX, mas os mantenedores não perceberam que-n
leva um incremento na especificação POSIX. A mensagem de ajuda desde 2010 se refere a um incremento , mas não é isso que acontece.