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:
- Abrir Terminal y teclear sudo pmset -g
- Nos muestra la configuración de energía, nos fijamos en hibernatemode que posiblemente esté en 0 (lo dejamos así)
- Si no está en 0 lo cambiamos con el comando sudo pmset hibernatemode 0 y comprobamos el cambio con sudo pmset -g de nuevo
- 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.
AVISO: las 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.
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.
Simplemente agradecerte tu aportación que excelentemente he aplicado en un netbook Advent 4211B que es un clon del MSI Wind U100.
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.
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
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.