locked
quotas de consumo de cpu RRS feed

  • Pregunta

  • hoy estoy pesado con las preguntas. :-)

     

    proceso del mundo Linux y estoy acostumbrado a poner quotas de cpu a algunos procesos, no se si Vista lo permite directamente pero siempre, entiendo yo, habrá manera mediante algun script o tarea programada el verificar excesivos consumos y o bien enviar alertas o bien dar un kill al proceso.

     

    no me asusta lo que tenga que aprender para esto si fuese posible el controlarlo por lo que soy todo oidos a las sugerencias.

     

    thx

    sábado, 28 de julio de 2007 10:45

Respuestas

  • Vista no tiene incorporadas quotas de CPU, pero es relativamente facil incorporarlas sobre todo para alguien que proviene de Linux y está acostumbrado al scripting. Si desconoces el scripting de Windows, puedes echar una mirada a este articulo mio obre ello: http://www.multingles.net/docs/jmt/comandos/comandos.html

     

    Bien, en tu caso, deberas usar el comandos pslist de www.microsoft.com/sysinternals en la parte de procesos y tareas el cual como verás es un comando de consola que te da el consumo de cpu por proceso. En un script con un for, podrás leer las lineas y obtener el nombre de programa, PID y consumo que serán los datos necesarios para poder analizar y luego matar el proceso (esto ultimo con el comando taskkill que trae el propio Vista),

     

    Si tienes problemas para nalizar con el for, puedes ver un ejemplo en este script mio http://www.multingles.net/docs/jmt/matarp2p.htm que te puede servir de ejemplo en scripting de windows.

     

    Un saludo,

    sábado, 28 de julio de 2007 12:00
  • Es que el scripting de Windows... no es facil... como tampo lo es el de Linux y hay que cambiar el chip  :-)

     

    He supuesto que el limite de CPU en cada tarea (excpeto en las del sistema) son 300 segundos (mira la linea 3). Igualmente si supera esa cantidad, se verifica que el nombre del programa esté en la lista de un archivo de tecto llamado pgms.txt que debe contener los nombres de programas a matar si superan ese limite de tiempo.

     

    Puedes cambiar la logica, es decir, lo ideal, a lo mejor sería el tener en el fichero pgms.txt los nombres de tareas a controlar y ademas su limite de tiempo en vez de ser este fijo. Te lo dejo como tarea  :-)

     

    El script es:

     

    @echo off
    setlocal enabledelayedexpansion
    set /a limite=300
    for /f "skip=10 tokens=1,2,7,8,9 delims=:. " %%g in ('pslist 2^>^&1') do call Stick out tongue0 %%g %%h %%i %%j %%k
    endlocal&goto :EOF

     

    Stick out tongue0
    call :nooctal %4
    set /a seg=%3*13+%n%*60
    call :nooctal %5
    set /a seg=%seg%+n
    if %seg% GEQ %limite% call :lista %1 %2
    goto :EOF

     

    :nooctal
    set n=%1
    if %n:~,1% == 0 set n=%n:~1%
    :goto :EOF

     

    :lista
    for /f %%p in (pgms.txt) do if /I {%1} EQU {%%p} taskkill /PID %2 /T /F
    goto :EOF

     

    Un saludo,
    sábado, 28 de julio de 2007 15:57

Todas las respuestas

  • Vista no tiene incorporadas quotas de CPU, pero es relativamente facil incorporarlas sobre todo para alguien que proviene de Linux y está acostumbrado al scripting. Si desconoces el scripting de Windows, puedes echar una mirada a este articulo mio obre ello: http://www.multingles.net/docs/jmt/comandos/comandos.html

     

    Bien, en tu caso, deberas usar el comandos pslist de www.microsoft.com/sysinternals en la parte de procesos y tareas el cual como verás es un comando de consola que te da el consumo de cpu por proceso. En un script con un for, podrás leer las lineas y obtener el nombre de programa, PID y consumo que serán los datos necesarios para poder analizar y luego matar el proceso (esto ultimo con el comando taskkill que trae el propio Vista),

     

    Si tienes problemas para nalizar con el for, puedes ver un ejemplo en este script mio http://www.multingles.net/docs/jmt/matarp2p.htm que te puede servir de ejemplo en scripting de windows.

     

    Un saludo,

    sábado, 28 de julio de 2007 12:00
  • NOTA: todos esos comandos hay que ejecutarlos en "Solo Simbolo del sistema" (cmd.exe) pero arrancado con privilegios, es decir con boton derecho sobre él, y "ejecutar como administrador" (o bien con el comando runas)

     

    Un saludo,

     

    sábado, 28 de julio de 2007 12:09
  • ahora mismito me pongo a ello

    si tengo dudas, que las tendré, ya te preguntaré y si me sale, ya pondré el script aquí por si admite mejoras 

     

    thx

    sábado, 28 de julio de 2007 12:53
  • ME RINDO !!!!  

     

    una manita.
    sábado, 28 de julio de 2007 15:49
  • Es que el scripting de Windows... no es facil... como tampo lo es el de Linux y hay que cambiar el chip  :-)

     

    He supuesto que el limite de CPU en cada tarea (excpeto en las del sistema) son 300 segundos (mira la linea 3). Igualmente si supera esa cantidad, se verifica que el nombre del programa esté en la lista de un archivo de tecto llamado pgms.txt que debe contener los nombres de programas a matar si superan ese limite de tiempo.

     

    Puedes cambiar la logica, es decir, lo ideal, a lo mejor sería el tener en el fichero pgms.txt los nombres de tareas a controlar y ademas su limite de tiempo en vez de ser este fijo. Te lo dejo como tarea  :-)

     

    El script es:

     

    @echo off
    setlocal enabledelayedexpansion
    set /a limite=300
    for /f "skip=10 tokens=1,2,7,8,9 delims=:. " %%g in ('pslist 2^>^&1') do call Stick out tongue0 %%g %%h %%i %%j %%k
    endlocal&goto :EOF

     

    Stick out tongue0
    call :nooctal %4
    set /a seg=%3*13+%n%*60
    call :nooctal %5
    set /a seg=%seg%+n
    if %seg% GEQ %limite% call :lista %1 %2
    goto :EOF

     

    :nooctal
    set n=%1
    if %n:~,1% == 0 set n=%n:~1%
    :goto :EOF

     

    :lista
    for /f %%p in (pgms.txt) do if /I {%1} EQU {%%p} taskkill /PID %2 /T /F
    goto :EOF

     

    Un saludo,
    sábado, 28 de julio de 2007 15:57
  • joer!... me ha sustituido dos puntos y p por una carita.... cambia la carita por "dos puntos y la letra p"

     

    Un saludo,

     

    sábado, 28 de julio de 2007 15:59
  • gracias gracias gracias gracias.

     

    funciona y me quedo la tarea pendiete.

    lo he mirado y entiendo todo excepto que no se el por qué llamas a esa rutina :nooctal para cortar los caracteres que empiecen por cero. ¿es una limitacion?

     

    thx

     

    sábado, 28 de julio de 2007 16:16
  •  berracus Escribió:

    no se el por qué llamas a esa rutina :nooctal para cortar los caracteres que empiecen por cero. ¿es una limitacion?

     

    Es que al asignar variables convirtiendolas a numero (para poder operar matematicamente con ellos) con el /a, windows entiende que los numeros que empiezan por "0" son octales (y si empiezan por "x" son hexadecimales). En este caso, 09 segundos, por ejemplo, sería inválido al no ser un numero octal correcto. Por eso suprimo el cero inicial si existiese.

     

    Un saludo,

    sábado, 28 de julio de 2007 16:22
  • gracias socio, te debo una.

     

     

    sábado, 28 de julio de 2007 16:39
  • Perdon, lo he repasado y habia un error al convertir las horas a segundos. La linea que pone:

     

    set /a seg=%3*13+%n%*60

     

    debe ser:

     

    set /a seg=%3*3600+%n%*60

     

    Un saludo,

    sábado, 28 de julio de 2007 17:44