Mi sistema (Z390 Aorus Elite + i9-9900K + RX 6600 XT) con macOS 15 Sequoia no siempre entra en reposo como debe. En algunas ocasiones lo hace, apagando luces y ventiladores, pero en otras se mantiene activo, incluso con la pantalla encendida. Esto sucede con la misma configuración que utilizo en macOS 14 Sonoma y macOS 13 Ventura en los que el sistema entra en suspensión con normalidad.
Origen del fallo
Hay 2 situaciones que pueden provocar este comportamiento:
- El proceso apsd (Apple Push Notification Services Daemon): cuando está activo el reposo suele fallar. Este proceso parece estar relacionado con las notificaciones de varias aplicaciones y servicios. Puede ser detenido con uno de estos comandos:
sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.apsd.plist
o este otrosudo launchctl bootout -w /System/Library/LaunchDaemons/com.apple.apsd.plist
- Información del Sistema >> Alimentación >> Eventos de Activación: el reposo suele fallar cuando aparecen Eventos Programados que pueden estar generados por diferentes procesos dependientes de com.apple.alarm (son de Tipo Wake). También puedes verlos con el comando
sudo pmset -g sched
. Estos eventos se pueden borrar con el comandosudo pmset schedule cancelall
Si no hay Eventos Programados y el proceso apsd está detenido, el reposo funciona bien.
Proceso launchd
macOS usa launchd para administrar daemons y agentes (tareas, procesos o programas residentes que corren en segundo plano sin interacción con el usuario) y puedes usarlo para ejecutar scripts de shell. No se puede interactuar con launchd directamente, hay que usar el comando launchctl para arrancar o parar daemons y agentes. Durante el arranque, launchd es el primer proceso que ejecuta el kernel. Estos son los lugares donde macOS guarda los archivos de configuración de estos procesos que corren en segundo plano:
- /Sistema/Librería/LaunchDaemons: Daemons del sistema instalados por Apple, carpeta protegida
- /Sistema/Librería/LaunchAgents: Agentes instalados por Apple, carpeta protegida
- /Librería/LaunchDaemons: Daemons del sistema añadidos por otras aplicaciones
- /Librería/LaunchAgents: Agentes añadidos por otras aplicaciones
- ~/Librería/LaunchAgents: Agentes añadidos por otras aplicaciones que se aplican sólo al usuario que inicia sesión.
Existe la posibilidad de crear tareas controladas por launchctl con archivos plist localizados en las carpetas /Library/LaunchAgents, /Library/LaunchDaemons o ~/Library/LaunchAgents. Una diferencia importante es que las tareas existentes en /Library/LaunchDaemons pueden ser ejecutas como root pero las de las carpetas LaunchAgents se ejecutan como el usuario en sesión.
He creado una tarea que se lanza cada cierto tiempo ejecutando los 2 comandos referidos más arriba (borrar eventos programados y detener apsd). Como ambos comandos llevan sudo, el archivo plist ha de ir en /Library/LaunchDaemons. Lo siguiente es una guía de cómo lo he hecho. Sobre esto hay mucha información en Internet, yo me limitaré a describir mi experiencia personal en lo que aplica al modo de reposo en macOS Sequoia.
Crear los archivos
Crear archivo de comandos de Terminal y guardarlo como nosched.sh:
#!/bin/zsh
sudo pmset schedule cancelall
sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.apsd.plist
Copiarlo a /usr/local/bin:
sudo cp /Users/yo/Desktop/LaunchDaemons/nosched.sh /usr/local/bin
Hacer a root propietario del archivo:
sudo chown root:wheel /usr/local/bin/nosched.sh
Crear un archivo plist y guardarlo como com.user.nosched.plist:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.user.nosched</string>
<key>ProgramArguments</key>
<array>
<string>/usr/local/bin/nosched.sh</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>StartInterval</key>
<integer>300</integer>
<key>KeepAlive</key>
<true/>
</dict>
</plist>
En este archivo tenemos:
- Label: etiqueta que ha de coincidir con el nombre del archivo sin la extensión .plist
- ProgramArguments: el comando o archivo que se ha de ejecutar
- RunAtLoad: activar desde el arranque
- StartInterval: intervalo de tiempo en segundos entre ejecuciones
- KeepAlive: mantener activo.
Copiarlo a /Library/LaunchDaemons. Ya se ha comentado que los archivos plist de la carpeta /Library/LaunchDaemons pueden ser ejecutados como root pero los de la carpeta /Library/LaunchAgents son ejecutados como el usuario activo.
sudo cp /Users/yo/Desktop/LaunchDaemons/com.user.nosched.plist /Library/LaunchDaemons
Hacer a root propietario del archivo:
sudo chown root:wheel /Library/LaunchDaemons/com.user.nosched.plist
Respecto al proceso apsd, /System/Library/LaunchDaemons/com.apple.apsd.plist ya existe pero la carpeta /System está protegida y macOS no deja modificarla o actuar sobre ella por lo que, para poder detener apsd, es necesario funcionar con SIP (parcialmente) deshabilitada.
Puedes usar csr-active-config=03080000
en config.plist de OpenCore (0x803 en Clover), es el mismo valor que requiere OCLP para aplicar sus parches por lo que, si ya usas OCLP, no necesitas modificar config.plist. Esta configuración devuelve Unknown state
al ejecutar csrutil status en Terminal y las variables de seguridad que deshabilita son:
CSR_ALLOW_UNTRUSTED_KEXTS - 0x1 (1)
CSR_ALLOW_UNRESTRICTED_FS - 0x2 (2)
CSR_ALLOW_UNAUTHENTICATED_ROOT - 0x800 (2,048).
Poner en marcha la tarea
Después de reiniciar con el valor modificado de SIP, el proceso apsd deja de interferir con el reposo. Respecto a los eventos programados, puedes arrancar la tarea para que esté activa en segundo plano con uno de estos de estos comandos:
sudo launchctl load /Library/LaunchDaemons/com.user.nosched.plist
# en mi caso ambos parecen funcionar igual
sudo launchctl start /Library/LaunchDaemons/com.user.nosched.plist
Si al ejecutar load obtienes este error:
Load failed: 5: Input/output error
Try running launchctl bootstrap as root for richer errors.
Añade bootstrap para recibir información detallada del motivo del error.:
sudo launchctl bootstrap /Library/LaunchDaemons/com.user.nosched.plist
Para ver si está arrancado el proceso:
sudo launchctl list | grep com.user.nosched
# com.user.nosched ha de estar presente
- 0 com.user.nosched
Para ver si ya no está activo apsd:
sudo launchctl list | grep com.apple.apsd
# el comando no devuelve nada si com.apple.apsd está detenido
Ahora puedes configurar Ahorro de Energía con el comando pmset. Ejemplo:
sudo pmset displaysleep 1;sudo pmset disksleep 2;sudo pmset sleep 6
El script de shell aparece en los Ítems de inicio (Ajustes del Sistema >> General).
Buenas noches. Yo he probado actuando sólo sobre los eventos programados y no sobre apsd para no tener que modificar SIP.
Con este cambio se han solucionado los fallos con sleep que tenía en Sequoia, parece que en mi sistema no es necesario deshabilitar el proceso apsd.
Llevo poco tiempo con ello, hasta ahora no he observado nada raro.
Gracias por la información.
Hola, Antonio. Yo también he probado con y sin la parte que activa o desactiva apsd y es cierto que el reposo parece funcionar bien con una única acción: ejecutar cada cierto tiempo el comando
sudo pmset cancelall
para no tener eventos de activación programados.Cuando escribí el artículo había leído en foros que apsd podía estropear el reposo en Sequoia y lo diseñé con ambas acciones. Pero, igual que te pasa a ti, parece funcionar también sin la parte de apsd.
Sin embargo, en InsanelyMac y en Reddit hay posts de usuarios con Sequoia en cuyos sistemas no funciona bien sleep si no desactivan apsd.