Problemas con el reposo en macOS 10.6 (2)

Autosleep-Script de KWS: cómo hacer que funcione el modo de reposo en el Hackintosh (si sleep funciona por comando o teclado pero no desde el Economizador)

El usuario KWS tiene un artículo muy interesante en InsanelyMac, el artículo se titula «Autosleep-Script, if sleep by command works its cheaper than a new dvd-drive…» y en él plantea una posible solución para aquellos casos en que el ordenador entra bien en reposo desde:

– comando en Terminal
– botón Reposo del cuadro de diálogo que se muestra al pulsar Ctrl+Eject
– menú Manzana / Reposo
– al pulsar Cmd+Alt+Eject

pero no funciona bien cuando ha de entrar en reposo de acuerdo con la programación del Economizador (o bien no entra en reposo o bien se reinicia…).

KWS diseñó un script que realiza varias funciones:

  • lee información del sistema para conocer el período de inactividad que está marcado antes de entrar en reposo
  • detecta si iTunes o Quicktime o DVDPlayer están reproduciendo algún contenido para no entrar en reposo
  • detecta si hay actividad de Finder o de AppleFileServer para no entrar en reposo si se están copiando archivos en local o entre los ordenadores de nuestra red
  • impide el reposo si la carpeta Descargas cambia su tamaño en unos intervalos de tiempo predefinidos lo cual indicaría que Safari u otro programa está descargando archivos en esa carpeta o alguna subcarpeta
  • impide el reposo si alguno de los programas configurados en el script superan una carga de procesador predeterminada.

Este script se puede colocar en cualquier parte y se añade a los ítems de arranque de Preferencias de Usuario para que esté siempre en marcha detectando cuándo se cumple el período de inactividad y llevar al PC al reposo.

Lo he probado en mi hackintosh que sin este script entra bien en suspensión y sale bien de ella cuando lo hace de alguna de las formas descritas más arriba pero falla cuando lo hace desde el programador (se reinicia) y parece funcionar bastante bien.

Detectar período de inactividad  del sistema e iniciar sleep

Se realiza mediante este código:

--- comprobar tiempo de espera para entrar en reposo
--- poner PC en reposo si no hay condiciones que lo impidan
tell current application
set systemSleepDelay to (do shell script "pmset g | perl --lane "if(/ sleep/) {print $F[-1]; last;}"") as integer
if systemSleepDelay > 0 then
set systemSleepDelay to systemSleepDelay * 60
set idleTime to (do shell script "ioreg c IOHIDSystem | perl --lane "if(Idle//) {print $F[-1]1000000000;/ last;}"") as string
set oldDelims to AppleScript's text item delimiters'
set AppleScript's text item delimiters to {"."}'
set zahl1 to text item 1 of idleTime
set idleTime to zahl1 as integer
if idleTime > systemSleepDelay then
tell application "System Events"
key code 58
end tell
tell application "System Events" to sleep
end if
set AppleScript's text item delimiters to oldDelims'
end if
end tell


Impedir reposo si iTunes, QuickTime o DVD Player están reproduciendo

Se realiza mediante este código:

--- no hacer nada si iTunes, DVD Player o Quicktime están reproduciendo
tell application "System Events"
    if exists process "iTunes" then
        tell application "iTunes"
            if player state is playing then
                return
            end if
        end tell
    end if
end tell
tell application "System Events"
    if exists process "DVD Player" then
        tell application "DVD Player"
            if dvd state is playing then
                return
            end if
        end tell
    end if
end tell
tell application "System Events"
    if exists process "QuickTime Player" then
        tell application "QuickTime Player"
            if (count of documents) > 0 then
                repeat with j from 1 to count of documents
                    if document j is playing then
                        return
                    end if
                end repeat
            end if
        end tell
    end if
end tell


Impedir reposo si la carpeta Descargas cambia de tamaño

Ello indicaría que estamos descargando algo desde Safari o algún otro programa cuyo destino de las descargas sea esa carpeta o alguna subcarpeta. Se realiza mediante este código:

set filePath to path to home folder from local domain as string
set x to filePath & "Downloads:" as alias
tell current application
    set theSize to size of (info for x)
    delay 60
    set theSize2 to size of (info for x)
    if theSize = theSize2 then
    else
        return
    end if
end tell


Impedir reposo si alguno de los programas configurados supera una carga de CPU predefinida

En este bloque de código hay que añadir los programas cuya carga de CPU deseamos tener en cuenta, se añaden con el formato «Programa:número» donde Programa es el nombre exacto del programa en Monitor de Actividad y número es el límte de la carga de CPU teniendo en cuenta que 6 sería 0.6%, 20 sería 2%, etc. Se realiza mediante este código:

set CPUload to {"Finder:6", "AppleFileServer:10", "WindowServer:14", "Utilidad de Discos:10", "xx"}

repeat with i from 1 to (count every item of CPUload)
    try
        set Prog1 to item i of CPUload
        if Prog1 is "xx" then
        else
            set AppleScript's text item delimiters to {":"}
            set Prog to text item 1 of Prog1
            set Percent to text item 2 of Prog1
            set Prog1 to do shell script ("ps auxww | grep '[/]" & Prog & "'" & " |"
grep '" & user & "' | awk '{print $2}'")"
            if Prog1 is greater than 0 then
                set cpu_usage to (do shell script ("ps -c -o %cpu='' -p " & Prog1)) as integer
                if cpu_usage > Percent then
                    return
                end if
            end if
        end if
    end try
end repeat


Copia de archivos en local o en red

La detección de actividad del Finder (copia de archivos en local) o de AppleFileServer (copia de archivos entre ordenadores) se hace con este código:

set user to do shell script "whoami"
set Prog1 to do shell script ("ps auxww | grep '[/]" & "Finder" & "'" & " |"
grep '" & user & "' | awk '{print $2}'")"
if Prog1 is greater than 0 then
    set cpu_usage to (do shell script ("ps -c -o %cpu='' -p " & Prog1)) as integer
    if cpu_usage > 2 then
        return
    end if
end if
set Prog2 to do shell script ("ps auxww | grep '[/]" & "AppleFileServer" & "'" & " |"
grep '" & "root" & "' | awk '{print $2}'")"
if Prog2 is greater than 0 then
    set cpu_usage to (do shell script ("ps -c -o %cpu='' -p " & Prog2)) as integer
    if cpu_usage > 2 then
        return
    end if
end if


Programas «sleep-resistants» que impiden el reposo si están en ejecución

El script tiene la opción de añadir programas a una lista de excepciones, si un programa que está en esa lista está arrancado (ejecutándose) el script no lleva al modo de reposo, KWS los llama aplicaciones sleep-resistants. Para añadir programas a esa lista es necesario saber el nombre del proceso, se puede ver en Monitor de Actividad (ej: Transmission), y en la línea del script que contiene

set Programas to {«yy», «yy», «yy»}

hay que reemplazar yy por el proceso elegido:

set Programas to {«Transmission», «Utilidad de Discos», «VLC», «yy»}

set Programas to {"yy", "yy", "yy"}
repeat with i from 1 to (count every item of Programas)
    set ProgName to item i of Programas
    if ProgName is "yy" then
    else
        tell application "System Events"
            if exists process ProgName then
                return
            end if
        end tell
    end if
end repeat


Preferencias del Sistema – Economizador

La configuración del Economizador ha de ser tener marcada la opción «Arrancar automáticamente tras un corte de suministro»:

BIOS: configuración

En BIOS tengo configurado el modo de reposo S1 con el botón de apagado en 4 segundos. Y en SL he comprobado por Terminal el modo de reposo para que coincida con el marcado en BIOS de esta manera:

  1. Abrir Terminal y teclear sudo pmset -g
  2. Nos muestra la configuración de energía, nos fijamos en hibernatemode que posiblemente esté en 0 (lo dejamos así)
  3. Si no está en 0 lo cambiamos con el comando sudo pmset hibernatemode 0 y comprobamos el cambio con sudo pmset -g de nuevo
  4. Apple emplea 2 modos de hibernatemode en sus ordenadores, el modo 0 (equivale al modo S1 de BIOS) en sus equipos de escritorio y el modo 3 (equivale al modo S3 de BIOS) en sus portátiles.

Con esta configuración el PC suspende bien apagando todos los indicadores luminosos, el ratón USB y los elementos giratorios, y puede despertar tanto desde ratón como desde teclado como desde botón de encendido.

Nota: gracias a KWS por su trabajo. Merece la pena leer el artículo original.

AVISOlas instrucciones y propuestas de esta página se proporcionan sin garantía de ningún tipo a la hora de llevarlas a la práctica. Lo que ha funcionado bien en mi caso pudiera no hacerlo en el tuyo.

5 comentarios en «Problemas con el reposo en macOS 10.6 (2)»

  1. Q3Soft: recomiendo a todos la lectura de tu artículo de InsanelyMac, titulado
    «Tutorial 100% funcional Snow Leopard 10.6.7 en MSI Wind U100 y Clones»
    por lo completo y bien explicado que está.
    Mi aportación a tu artículo es mínima, con el script de KWS como origen.
    Salu2, miliuco.

  2. Simplemente agradecerte tu aportación que excelentemente he aplicado en un netbook Advent 4211B que es un clon del MSI Wind U100.

  3. Hola, Ximo. El tema del reposo en portátiles es totalmente diferente.
    En los PCs con macOS puede suceder que el reposo funcione perfectamente cuando se activa desde el menú Manzana o el diálogo de Apagar o incluso por comando en Terminal pero falla cuando entra en reposo él solo al cumplirse el período de inactividad marcado en el Economizador. Este es mi caso y es para lo que se propone el arreglo.
    El motivo parece estar en que el PC en realidad puede entrar bien en reposo pero el archivo AppleIntelCPUPowerManagement controla tantas cosas actualmente en los Mac (en los que la gestión de energía está realmente avanzada) que en un ordenador no Mac falla en algunos aspectos de esa gestión.
    Entonces lo que hacemos es detectar cuándo toca ir a sleep pero que sea el script el que lo ordena por comando justo antes de que AppleIntelCPUPowerManagement lo haga.

    En portátiles es otro asunto. Muchos portátiles sólo hacen bien el reposo con pantalla externa porque la pantalla interna no está bien instalada o porque le falta algo a su instalación para entenderse perfectamente con la gestión de energía. Haz esta prueba sin pantalla externa: vas a menú Manzana y pones el portátil a dormir, si lo hace bien y despierta bien puedes probar la solución que yo propongo, si falla no te servirá de nada.

  4. Yo sólo he experimentado en laptops mas en concreto en un Acer 5612 y ahora en un netbook n450.

    En el portátil el sleep no funciona ná de ná excepto si pongo un monitor externo, siempre tengo que estar con el Cafeine pues es irrecuperable cuando se apaga la pantalla lo mismo con el netbook aunque en éste es peor al poner un monitor externo pues me sale pantalla dual sin posibilidad de control sobre ella y acaba apagándose también, deduzco que probablemente es debido al uso del nbi installer.

    Yo por experiencia sé que cada máquina es un mundo y que probados diferentes SOS en la misma ocurren extrañas cosas para detecciones de componentes de la misma y que no se puede generalizar sólo con las propias experiencias pero si en este conocimiento hackingtoshero tenemos que ir así mal vamos, mi pregunta es ¿Se te ocurre por qué en el portátil con pantallla externa funciona sleep y sin ella no? (Aparte de la calidad del monitor externo).

    Probado con Kaliway 10.5.2, iDeneb 10.5.5, iDeneb 10.5.8, iAtkos 1.5.7 y ahora con SL 10.6.5 (una Hazard 10.6.2 + el Combo update a 10.6.5)

    Aunque tengo que probar el escrito del que informas ¿Piensas que es una generalidad para controlar el sleep? 🙂 Ximo

  5. Sería muy interesante poder detectar la actividad del adaptador de red porque con ello este script se convertiría en una casi perfecta solución para el problema de sleep en los Hackintosh.

Los comentarios están cerrados.