2009-03-07 15 views
8

Quiero ejecutar el cliente [email protected] en mi caja Ubuntu 8.10 solo cuando está inactivo debido al gran consumo de RAM del programa.Programación en Linux: ejecuta una tarea cuando la computadora está inactiva (= no hay entrada de usuario)

Por "inactivo" me refiero al estado cuando no hay actividad del usuario (teclado, mouse o cualquier otro). Está bien que otros procesos (probablemente pesados) se ejecuten en ese momento dado que F @ H tiene la prioridad de CPU más baja. El objetivo es simplemente mejorar la experiencia del usuario y hacer un trabajo pesado cuando no está.

¿Cómo lograr esto?

Respuesta

12

Cuando la máquina en cuestión es una computadora de escritorio, puede enganchar una secuencia de comandos de inicio/detención en el protector de pantalla para que el proceso se detenga cuando el protector de pantalla esté inactivo y viceversa.

+1

xscreensaver permite hacerlo mediante xscreensaver-command -watch (ver http://www.jwz.org/xscreensaver/faq.html # watch) – wheleph

+0

Artículo sobre eso: http://wheleph.github.io/2009/12/20/fah-xsreensaver/ – wheleph

+0

¿Por qué cada respuesta supone que está instalado un protector de pantalla? – Bulletmagnet

1

El archivo /proc/loadavg tiene la carga actual del sistema. Puedes simplemente escribir un script bash para verificarlo, y si es bajo, ejecuta el comando. Luego puede agregarlo a /etc/cron.d para ejecutarlo periódicamente.

Este archivo contiene información sobre carga del sistema. Los primeros tres números representan el número de tareas activas en el sistema, procesos que se ejecutan actualmente , promediados durante los últimos 1, 5 y 15 minutos. El entrada siguiente muestra la instantánea número actual de tareas ejecutables - procesos que actualmente están programados para funcionar en lugar de ser bloqueado en una llamada sistema - y el número total de procesos en el sistema. La entrada final es la ID del proceso que se ejecutó más recientemente.

Ejemplo de salida:

0.55 0.47 0.43 1/210 12437 
+0

cargas no muestran compromiso excesivo pesado, el uso del intercambio, etc. No son una panacea para este tipo de decisión en un programa. –

4

Es más incómoda para organizar el proceso que sólo se presente cuando el sistema está inactivo.

En realidad, iniciar el programa en esas condiciones no es lo difícil. Tienes que hacer arreglos para que el programa se cierre limpiamente, y descubrir cómo y cuándo hacerlo.

Debe poder distinguir entre el uso de CPU propio de ese proceso y el de los otros programas que se pueden estar ejecutando, para que pueda saber si el sistema está "inactivo".

Es mucho más fácil para que el proceso sólo se puede programado cuando el sistema está inactivo. Simplemente use el comando 'nice' para iniciar el cliente Folding @ Home.

Sin embargo, eso no resolverá el problema de la RAM insuficiente. Si tiene habilitado el espacio de intercambio, el sistema debería poder intercambiar los procesos de baja prioridad de modo que no consuman recursos reales, pero tenga cuidado con un gran impacto en la E/S de disco cada vez que su cliente Folding @ Home intercambia dentro y fuera de RAM.

p.s. La RAM es muy barata en este momento ...

p.p.s. vea esto article

+0

¿Cómo es esto 'complicado' si escribe algo así como BOINC? :) –

+0

Lo que ES complicado es no anticipar el estado del sistema una vez que haya terminado, que traté de responder. –

+0

Gracias por su respuesta, Alnitak. He aclarado el significado de "inactivo" en la pregunta. – wheleph

2

Va a querer ver algunas cosas para determinar 'inactivo' y también explorar la llamada sysinfo() (el enlace señala la diferencia en la estructura que puebla entre varias versiones del kernel).

Linux no gestiona la memoria de forma típica. No solo mire cargas, mire la memoria. En particular,/proc/meminfo tiene una maravillosa línea iniciada con Committed_AS, que le muestra cuánta memoria el kernel prometió a otros procesos. Compare eso con lo que aprendió de sysinfo y tal vez se dé cuenta de que un promedio de carga de un minuto de 0.00 no significa que sea el momento de ejecutar algún programa que quiera asignar 256MB de memoria, ya que el kernel puede estar realmente vendiendo en exceso. Tenga en cuenta que todos los valores completados por sysinfo() están disponibles a través de/proc, sysinfo() es una forma más sencilla de obtenerlos.

También querrá ver cuánto tiempo ha pasado cada núcleo en IOWAIT desde el arranque, que es un indicador aún más sólido de si debe ejecutar un cerdo de recursos de E/S. Tome esa información en/proc/stat, la primera línea contiene el conteo total de todas las CPU. IOWAIT está en el campo 6 °. Por supuesto, si tiene la intención de establecer afinidad a una sola CPU, solo esa CPU sería de interés (sigue siendo el sexto campo, en unidades de USER_HZ o típicamente en 100 'de segundo). Promedio contra btime, también encontrado en/proc/stat.

En resumen, no se limite a mirar los promedios de carga.

EDITAR

Usted no debe suponer una falta de entrada de usuario inactivo .. cron puestos de trabajo tienden a correr .. servicios públicos quedar gravados de vez en cuando, etc. inactivo sigue siendo su mejor suposición basada en la lectura los valores (o tal vez más) que he enumerado anteriormente.

EDIT 2

En cuanto a los valores de perilla en/proc/sys/vm también le da una buena indicación de lo que el usuario piensa está inactivo, en particular, swappiness. Me doy cuenta de que está haciendo esto solo en su propia caja, pero esta es una wiki autoritativa y el título de la pregunta es genérico :)

+0

Gracias por ideas interesantes, tinkertim. He usado la palabra "inactivo" en otro significado que he aclarado en la pregunta. – wheleph

+0

Dado cron y otras cosas, no puede describir inactivo de esa manera. La falta de entrada del usuario NO significa inactividad, especialmente cuando 'updatedb' se ejecuta en el medio de la noche. –

+1

notará que antes de editar, aclaró que no le molestan otras tareas de "fondo", solo respuesta interactiva. – Alnitak

4

puede ser que necesite establecer en la tarea inactiva la más baja prioridad a través de nice.

+0

Esta es de hecho la forma en que debe hacer esto en Linux. – Arafangion

+0

El problema con la prioridad del proceso es que solo es una CPU y en estos días el disco suele ser el principal problema –

+0

topicstarter hablar sobre el uso de la RAM pero no sobre el uso del disco –

0

Vea este hilo de un script de perl que verifica cuando el sistema está inactivo (a través de gnome screensaver).
Puede ejecutar comandos cuando se inicia y se detiene la marcha en vacío.
Estoy usando esto con algunas secuencias de comandos para cambiar las preferencias BOINC al ralentí
(para dar BOINC más memoria y uso de la CPU).

perl script on ubuntu forums

Cuestiones relacionadas