Como eu estrangulo um comando em uma janela de terminal?

8

Eu precisava rodar convertcom muitas imagens ao mesmo tempo. O comando levou um bom tempo, mas isso não me incomoda.

O problema é que esse comando inutilizou meu computador enquanto o comando estava em execução (por cerca de 15 minutos).

Portanto, é possível limitar o comando limitando recursos (processador e memória) ao comando, diretamente da linha de comando? Isso só funciona se eu adicionar algo à mesma linha antes de pressionar, Enterporque, ao iniciar o processo, o computador fica mais lento que é impossível, por exemplo, mudar para "Monitor do sistema" e reduzir a prioridade.

Editar: resultados superiores e iotop

Consegui executar tope sudo iotop >iotop.txtenquanto fazia uma dessas operações de conversão. (O arquivo iotop.txt produzido é difícil de ler)

Resultados do topo:

   USUÁRIO PID PR NI VIRT RES SHR S% CPU% MEM TIME + COMANDO           
14275 nome de usuário 20 0 4043m 3.0g 1448 D 7.0 80.4 0: 16.45 converter 

Resultados do iotop:

[? 1049h [1; 24r (B [m [4l [? 7h [? 1h = [39; 49m [? 25l [39; 49m (B [m [H [2JTotal de DISCO LIDO: 1269,04 K / s | Total de DISCO DE DISCO : [59G0,00 B / s
(B [0; 7m DISCO DO USUÁRIO DO TID PRIO LEIA SWAPIN DE DISCO (B [0; 1; 7m IO> (B [0; 7m COMANDO [3; 2H (B [m2516 be / 4 nome de usuário 350.08 K / s 0.00 B / s 0,00% 0,00% zeitgeist-datahub
 7394 be / 4 nome de usuário 568,88 K / s 0,00 B / s 77,41% 0,00% --rendere ~ .530483991 [5; 1H14275 nome de usuário ocioso 350,08 K / s 0,00 B / s 37,49% 0,00% convert S ~ f test.pdf [6 ; 2S2048 be / 4 root [6; 24H0,00 B / s 0,00 B / s 0,00% 0,00% [trabalhador / 3: 2]
[5G1 ser / 4 raiz [7; 24H0,00 B / s 0,00 B / s 0,00% 0,00% init

Além disso, mesmo após o término do processo, o computador não retorna ao desempenho anterior. Eu encontrei uma maneira de contornar isso, executando sudo swapoff -aseguido porsudo swapon -a

Façam
fonte

Respostas:

5

Oh, garoto, eu só peguei isso ... citando OP:

Além disso, mesmo após o término do processo, o computador não retorna ao desempenho anterior. Eu encontrei uma maneira de contornar isso, executando sudo swapoff -aseguido porsudo swapon -a

OK, isso significa que você estava esgotando a RAM disponível no seu sistema, o que significa que você está simplesmente tentando executar muitos convertprocessos ao mesmo tempo. Precisamos examinar sua sintaxe real na geração convertpara aconselhar, mas basicamente, você precisa garantir que não tente abrir mais processos simultâneos do que a RAM para lidar confortavelmente.

Como você declara o que está causando isso convert *.tif blah.pdf, o que está acontecendo é que o conteúdo de cada TIF e sua conversão em PDF estão sendo inseridos na RAM de uma só vez. O que você precisa fazer é dividir o trabalho para que isso não seja necessário. Uma possibilidade que vem à mente é fazer algo como find . -iname '*.tif' | xargs -I% convert % %.pdf, depois usar pdftkou algo parecido para colar todos os PDFs individuais. Se você realmente deseja ter uma fantasia e possui uma CPU multicore, isso também oferece a chance de escrever um pequeno script para executar conversões em lotes de n , onde n é o seu número de núcleos e realizar a tarefa toda significativamente mais rapidamente . :)

Como fazer no pdftk: http://ubuntuhowtos.com/howtos/merge_pdf_files (basicamente se resume a sudo apt-get install pdftk; pdftk *.pdf cat output merged.pdf)

Jim Salter
fonte
Estou apenas executando um convert *.tif bla.pdfprocesso de cada vez, mas a entrada é um monte de imagens tif. É uma maneira de produzir um pdf a partir de um monte de imagens que funcionam bem, mas sufocam meu PC.
Para Do
^^ Ver resposta editado por favor :)
Jim Salter
Isso funcionou perfeitamente com uma modificação simples. find . -iname '*.tif' | xargs -I% convert % %.pdfem vez de find . -iname '*.pdf' | xargs -I% convert % %.pdf. Foi mais rápido também! Obrigado.
Para Do
Desculpe, mau funcionamento entre o cérebro e os dedos :-)
Jim Salter
Uma pequena modificação ... É bom saber sobre as opções -exece . No seu caso, em vez de usar , eu usaria:-execdirfindxargsfind -iname '*.tif' -execdir convert {} {}.pdf ';'
Paddy Landau
12

man niceE se você precisar de I / O estrangulamento man ionice.

Vejamos alguns exemplos simples.

Limitando o uso da CPU:

you@box:/$ nice -n 10 /usr/bin/convert blah.gif blah.jpg

Pela sua descrição, no entanto, o uso da CPU quase certamente não é o seu verdadeiro problema aqui. Provavelmente, você está tendo uma contenção severa de E / S.

Uso do disco de regulagem:

you@box:/$ ionice -c2 -n7 /usr/bin/convert blah.gif blah.jpg

-c2é "melhor esforço" e -n7é a menor prioridade "melhor esforço". Portanto, isso reduzirá o trabalho para diminuir a prioridade de E / S do que a maioria das outras coisas no sistema.

you@box:/$ ionice -c3 /usr/bin/convert blah.gif blah.jpg

-c3(nenhum nível de prioridade necessário) significa "Somente ocioso". Os trabalhos configurados para -c3SOMENTE ocupam um tempo ocioso de agendamento de disco, praticamente sem nenhum impacto no sistema - mas potencialmente um tempo de execução consideravelmente mais longo para o seu trabalho, dependendo da ocupação do restante do sistema.

Jim Salter
fonte
Como eu integraria niceum comando convert? Se não estou errado, bons trabalhos para os processos em execução.
você
1
Veja acima ... Além disso, srsly, leia a página de manual. É uma página de manual muito fácil, nada mastigável. :-)
Jim Salter
Eu tentei. Meio que ajudou, mas não o suficiente. Vou tentar da nice -n 20próxima vez.
Para fazer
Honestamente, não tenho muita certeza de que a carga da CPU seja o seu problema aqui. Você já tentou fazer iotopdurante a execução do processo? Normalmente, um único processo que consome muita CPU terá muito pouco efeito sobre a usabilidade do sistema, mas um processo que atrapalha o disco rígido pode MUITO rapidamente interromper tudo - especialmente se você estiver usando uma unidade convencional, não um SSD.
Jim Salter
Como todo o sistema fica inutilizável para você, você pode tentar algo convert blah.gif blah.jpg & iotopsemelhante ao que iotopserá acionado instantaneamente assim que iniciar seu converttrabalho.
Jim Salter
2

Aqui está um artigo muito bom sobre o uso de um programa chamado cpulimitpara limitar o uso da CPU de qualquer processo:

http://maketecheasier.com/limit-cpu-usage-of-any-process-in-linux/2010/09/22

O problema é como você disse, encontrando o PID do convertprocesso após o início.

Após iniciar, convertse você ainda pode digitar comandos no terminal, pode executar ps aux | grep convertpara encontrar seu PID e, em seguida, sudo cpulimit -p PID -l CPU%iniciar a regulagem.

Ou, se a inicialização converttambém bloquear o seu terminal, o artigo mostra como você pode executar cpulimitcomo um daemon em segundo plano que monitorará e acelerará automaticamente todos os processos durante uma certa quantidade de uso da CPU. Boa sorte!

liso-texano
fonte
Esse script é uma péssima idéia e primitivo comparado ao nicecomando interno. cpulimitlimitará o processo a um determinado% de uso da CPU, independentemente de mais alguma coisa precisar do tempo da CPU; nice, por outro lado, define níveis de prioridade (total de 40!) que permitem priorizar uma tarefa acima (ou abaixo) de outras.
Jim Salter