¿Cómo estrangulo un comando en una ventana de terminal?

8

Necesitaba correr convertcon muchas imágenes al mismo tiempo. El comando tardó bastante pero esto no me molesta.

El problema es que este comando inutilizó mi computadora mientras se ejecutaba el comando (durante aproximadamente 15 minutos).

Entonces, ¿es posible limitar el comando limitando los recursos (procesador y memoria) al comando, directamente desde la línea de comando? Esto solo puede funcionar si agrego algo a la misma línea antes de presionar Enterporque una vez que comienzo el proceso, la computadora se ralentiza tanto que es imposible, por ejemplo, cambiar a "Monitor del sistema" y reducir la prioridad.

Editar: resultados superiores e iotop

Logré correr topy sudo iotop >iotop.txtmientras hacía una de estas operaciones de conversión. (El archivo iotop.txt producido es difícil de leer)

Resultados de arriba:

   PID USUARIO PR NI VIRT RES SHR S% CPU% MEM TIME + COMMAND           
14275 nombre de usuario 20 0 4043m 3.0g 1448 D 7.0 80.4 0: 16.45 convertir 

Resultados de iotop:

[? 1049h [1; 24r (B [m [4l [? 7h [? 1h = [39; 49m [? 25l [39; 49m (B [m [H [2JLECTURA TOTAL DEL DISCO: 1269.04 K / s | ESCRITURA DEL DISCO total : [59G0.00 B / s
(B [0; 7m TID PRIO USER DISK READ DISK WRITE SWAPIN (B [0; 1; 7m IO> (B [0; 7m COMMAND [3; 2H (B [m2516 be / 4 username 350.08 K / s 0.00 B / s 0.00% 0.00% zeitgeist-datahub
 7394 be / 4 nombre de usuario 568.88 K / s 0.00 B / s 77.41% 0.00% --rendere ~ .530483991 [5; 1H14275 nombre de usuario inactivo 350.08 K / s 0.00 B / s 37.49% 0.00% convert S ~ f test.pdf [6 ; 2H2048 be / 4 raíz [6; 24H0.00 B / s 0.00 B / s 0.00% 0.00% [kworker / 3: 2]
[5G1 be / 4 root [7; 24H0.00 B / s 0.00 B / s 0.00% 0.00% init

Además, incluso después de que finaliza el proceso, la computadora no vuelve al rendimiento anterior. Encontré una forma de evitar esto corriendo sudo swapoff -aseguido desudo swapon -a

Que hacer
fuente

Respuestas:

5

Oh, muchacho, acabo de enterarme de esto ... citando a OP:

Además, incluso después de que finaliza el proceso, la computadora no vuelve al rendimiento anterior. Encontré una forma de evitar esto corriendo sudo swapoff -aseguido desudo swapon -a

Bien, eso significa que estaba agotando la RAM disponible en su sistema, lo que significa que simplemente está tratando de ejecutar demasiados convertprocesos a la vez. Necesitaríamos mirar su sintaxis real en el desove convertpara asesorar, pero básicamente, debe asegurarse de no intentar abrir más procesos simultáneos de los que tiene la RAM para manejar cómodamente.

Como usted indica qué está causando esto convert *.tif blah.pdf, lo que está sucediendo es que el contenido de cada TIF y su conversión a PDF se introducen en la RAM de una vez. Lo que debe hacer es dividir el trabajo para que no sea necesario. Una posibilidad que salta a la mente es hacer algo así find . -iname '*.tif' | xargs -I% convert % %.pdf, luego usar pdftko algo así para unir todos los archivos PDF individuales. Si realmente quieres ponerte elegante, y tienes una CPU multinúcleo, esto también te brinda la oportunidad de escribir un pequeño script para ejecutar conversiones en lotes de n , donde n es tu número de núcleos, y hacer todo todo significativamente más rápido . :)

pdftk how-to: http://ubuntuhowtos.com/howtos/merge_pdf_files (básicamente se reduce a sudo apt-get install pdftk; pdftk *.pdf cat output merged.pdf)

Jim Salter
fuente
Solo estoy ejecutando UN convert *.tif bla.pdfproceso a la vez, pero la entrada es un montón de imágenes tif. Es una forma de producir un pdf a partir de un montón de imágenes que funciona bien pero ahoga mi PC.
Para hacer el
^^ vea la respuesta editada por favor :)
Jim Salter
Esto funcionó perfectamente con una simple modificación. find . -iname '*.tif' | xargs -I% convert % %.pdfen lugar de find . -iname '*.pdf' | xargs -I% convert % %.pdf. ¡También fue más rápido! Gracias.
Para hacer el
Lo sentimos, mal funcionamiento entre el cerebro y los dedos :-)
Jim Salter
Una pequeña modificación ... Es bueno saber acerca de las opciones -execy . En su caso, en lugar de usar , usaría:-execdirfindxargsfind -iname '*.tif' -execdir convert {} {}.pdf ';'
Paddy Landau
12

man nice, Y si es necesario de E / S de estrangulación man ionice.

Veamos algunos ejemplos simples.

Disminución del uso de CPU:

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

Sin embargo, según su descripción, el uso de la CPU no es su problema real aquí. Lo más probable es que esté teniendo una fuerte disputa de E / S.

Uso del disco de regulación:

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

-c2es el "mejor esfuerzo" y -n7es la prioridad más baja del "mejor esfuerzo". Por lo tanto, esto acelerará el trabajo para reducir la prioridad de E / S que la mayoría de las otras cosas en el sistema.

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

-c3(no es necesario un nivel de prioridad) significa "Solo inactivo". Los trabajos configurados -c3SOLAMENTE ocupan tiempo de programación de disco inactivo, sin prácticamente ningún impacto en el sistema, pero potencialmente un tiempo de ejecución considerablemente más largo para su trabajo, dependiendo de qué tan ocupado esté el resto del sistema.

Jim Salter
fuente
¿Cómo me integraría niceen un comando de conversión? Si no me equivoco, funciona bien para los procesos que ya se están ejecutando.
Para hacer el
1
Ver arriba ... También, srsly, lea la página del manual. Es una página de manual muy fácil, nada masticable. :-)
Jim Salter
Lo intenté. Más o menos ayudado pero no lo suficiente. Lo intentaré la nice -n 20próxima vez.
Para hacer el
Honestamente, no estoy muy seguro de que la carga de la CPU sea tu problema aquí. ¿Has intentado hacerlo iotopmientras ejecutas el proceso? Por lo general, un solo proceso que consume gran cantidad de CPU tendrá muy poco efecto sobre la usabilidad del sistema, pero un proceso que destruya el disco duro puede DETENER MUY rápidamente todo, especialmente si está utilizando una unidad convencional, no una SSD.
Jim Salter
Dado que todo el sistema queda bastante inutilizable para usted, puede intentar algo similar a convert blah.gif blah.jpg & iotoplo que se iotopactivará instantáneamente tan pronto como haya comenzado su converttrabajo.
Jim Salter
2

Aquí hay un artículo bastante bueno sobre el uso de un programa llamado cpulimitpara limitar el uso de CPU de cualquier proceso:

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

El problema es como usted dijo al encontrar el PID del convertproceso una vez que ha comenzado.

Después de comenzar, convertsi aún puede escribir comandos en la terminal, puede ejecutar ps aux | grep convertpara encontrar su PID y luego sudo cpulimit -p PID -l CPU%comenzar a acelerar.

O si el inicio converttambién bloquea su terminal, el artículo le muestra cómo puede ejecutarse cpulimitcomo un demonio en segundo plano que supervisará y acelerará automáticamente cualquier proceso durante una cierta cantidad de uso de la CPU. ¡Buena suerte!

texano liso
fuente
Este script es una mala idea, y primitivo en comparación con el nicecomando incorporado . cpulimitlimitará el proceso a un cierto% de uso de CPU, ya sea que cualquier otra cosa necesite o no el tiempo de CPU; nice, por el contrario, establece niveles de prioridad (¡40 en total!) que permiten priorizar una tarea por encima (o por debajo) de otras.
Jim Salter