3 votos

¿Por qué se congela la ventana de inicio de sesión en Mojave?

Este es un seguimiento a mi pregunta anterior: Las teclas de función dejan de funcionar después de un tiempo en Mojave

El problema que tenía era que loginwindow se mantenía congelado. En este Gist, se explica el problema en detalle. La explicación se puede encontrar a continuación.

macOS Mojave build >18A326g tiene un problema desagradable.

Básicamente, el loginwindow le gusta trabajar con hilos. Es tan apasionado por los hilos que continuará recolectándolos indefinidamente. Ahora, el problema con un proceso que recolecta tantos hilos es que, como dueño de todos los procesos que se ejecutan bajo su cuenta, si el proceso se bloquea, diga adiós a la mayoría de macOS.

Bueno, esto es exactamente lo que sucede. El loginwindow se congela en 4096 hilos y provoca que la mayoría de macOS sea inestable o inutilizable. Por ejemplo, muchos de los elementos del menú bajo el menú de Apple se vuelven inútiles, como Acerca de este Mac o las opciones de Suspender/Reiniciar/Apagar. Algunas de las teclas de función/multimedia también dejan de funcionar, como el brillo, el retroiluminación del teclado y las teclas de volumen.

También creo que la opción de cierre de sesión también se desactiva, pero no la he probado. Sin embargo, si esto es cierto, esto significa que la única manera de cerrar la sesión de manera confiable es utilizando este script con la opción --kill, que encuentra y mata el loginwindow por usted.

loginwindow en efecto recolecta 4096 hilos y luego se congela. Cada vez. De hecho, construí un notificador usando JXA para advertirme cuando la corrupción (hilos / 4096) alcance más del 90%.

Eso es aparte del punto, sin embargo. Hasta donde puedo decir, nadie más tiene este problema (o nunca lo han descubierto).

He reportado este problema a Apple hace 4 betas, pero el problema sigue aquí.

¿Cómo puedo averiguar qué está causando este problema? ¿Cómo puedo prevenirlo?

1 votos

Intentaría crear una nueva cuenta de administrador y ver si sigue sucediendo. Mi tiempo de actividad actual es de 6 días [nunca llega mucho más allá de eso en estos días con una nueva beta cada semana;) y loginwindow muestra solo 2 hilos; así que mi suposición es que no es el Sistema en sí, sino algo más que tienes en funcionamiento.

0 votos

Huh... Intentaré una nueva cuenta.

0 votos

@Tetsujin Puedo confirmar que es en todo el sistema, acabo de iniciar sesión a través de root y el problema persiste. (¡los hilos ya están en 9 tan pronto como inicio sesión!)

3voto

G. Martin Puntos 93

He notado el mismo problema exacto de la ventana de inicio de sesión colgada desde que actualicé a Mojave 10.14.5. Como señaló @Dev y algunas de las otras respuestas, hay algunas aplicaciones comunes que parecen contribuir a esto. En mi caso, Little Snitch es el culpable y he encontrado que las siguientes soluciones funcionan mejor como solución temporal. Mi sistema también está configurado para iniciar sesión automáticamente.

La solución inmediata para arreglar la ventana de inicio de sesión colgada es conectarse por ssh al host que está colgado y ejecutar este simple script (o una línea) para detener la ventana de inicio de sesión y luego iniciarla nuevamente usando launchctl.

#!/bin/sh
sudo launchctl stop com.apple.loginwindow
sleep 2
sudo launchctl start com.apple.loginwindow

O

sudo launchctl stop com.apple.loginwindow && sleep 2 && sudo launchctl start com.apple.loginwindow

La solución temporal a largo plazo hasta que Objective Development y/o Apple aborden este comportamiento problemático en su código es instrumentar un launch daemon que ejecute una versión modificada del script anterior al inicio.

  1. Crear el script en /usr/local/bin llamado fixHang.sh

    sudo touch /usr/local/bin/fixHang.sh
  2. Editar el script y pegar el contenido a continuación.

    sudo nano /usr/local/bin/fixHang.sh
    
    #!/bin/sh
    logFile="/Users/Michael/loginwindowdaemonscript.txt"
    echo "------------INICIO DEL ARRANQUE $(date)----------"
    ustart=$(date -j -f "%a %b %d %T %Z %Y" "date" "+%s")
    timestamp=$(date)
    loginPIDChar=$(ps -ef | grep -v "grep" | grep "/usr/libexec/UserEventAgent (Aqua)" | awk $'{print $2}' | wc | awk $'{print $1}')
    loginPID=$(ps -ef | grep -v "grep" | grep "/usr/libexec/UserEventAgent (Aqua)" | awk $'{print $2}')
    echo "$(date) - INICIO" >> "$logFile"
    echo "$(date) - PID de la ventana de inicio de sesión: $loginPIDWindow" >> "$logFile"
    echo "$(date) - PID de UserEventAgentAqua: $loginPID" >> "$logFile"
    while [ "$loginPIDChar" == "0" ];
    do
            echo "$(date) - INICIO DEL BUCLE" >> "$logFile"
            sleep 2
            echo "INICIO DE LA COMPROBACIÓN" >> "$logFile"
            loginPIDChar=$(ps -ef | grep -v "grep" | grep "/usr/libexec/UserEventAgent (Aqua)" | awk $'{print $2}' | wc | awk $'{print $1}')
            loginWindowPID=$(pgrep loginwindow)
            echo "$loginWindowPID" >> "$logFile"
            echo "loginPIDChar = $loginPIDChar" >> "$logFile"
            if [ "$loginPIDChar" != 0 ];
            then
                    timestamp=$(date)
                    loginWindowPID=$(pgrep loginwindow)
                    echo "$timestamp - MATAR PROCESO # $loginWindowPID" >> "$logFile"
                    sudo kill -9 "$loginWindowPID"
                    sleep 5
                    echo "$timestamp - SALIR DEL BUCLE" >> "$logFile"
                    break
            else
                    timestamp=$(date)
                    loginWindowPID=$(pgrep loginwindow)
                    echo "$timestamp - NÚMERO DE PROCESO: $loginWindowPID" >> "$logFile"
            fi
            sleep 2
            echo "$(date) - FIN DEL BUCLE" >> "$logFile"
    done
    sleep 5
    newloginWindowPID=$(pgrep loginwindow)
    uend=$(date -j -f "%a %b %d %T %Z %Y" "date" "+%s")
    echo "$(date) - Duración de la reparación: $((uend - ustart)) segundos" >> "$logFile"
    echo "$(date) - Antiguo número de PID de la ventana de inicio de sesión: $loginWindowPID" >> "$logFile"
    echo "$(date) - Nuevo número de PID de la ventana de inicio de sesión: $newloginWindowPID" >> "$logFile"
    echo "------------ARRANQUE COMPLETO $(date)----------" >> "$logFile"

Guardar el archivo (Ctrl+O + [ENTER]) y salir de nano (Ctrl+X + [ENTER])

  1. Hacer el script ejecutable y cambiar la propiedad a root:wheel

    sudo chmod +x /usr/local/bin/fixHang.sh
    sudo chown root:wheel /usr/local/bin/fixHang.sh
  2. Crear un launch daemon en /Library/LaunchDaemons que, al cargarse, ejecutará el script fixHang.sh al inicio

    sudo touch /Library/LaunchDaemons/com.startup.fixhang.plist
    sudo nano /Library/LaunchDaemons/com.startup.fixhang.plist
    
        Label
        com.startup.fixhang
        LaunchOnlyOnce
    
        LimitLoadToSessionType
    
            Aqua
    
        ProgramArguments
    
            sh
            -c
            /usr/local/bin/fixHang.sh
    
        RunAtLoad

Guardar el archivo (Ctrl+O + ENTER) y salir de nano (Ctrl+X + ENTER)

  1. Cambiar la propiedad de /Library/LaunchDaemons/com.startup.fixhang.plist a root:wheel

    sudo chown root:wheel /Library/LaunchDaemons/com.startup.fixhang.plist
  2. Cargar el launch daemon para ejecutarse al inicio

    sudo launchctl load /Library/LaunchDaemons/com.startup.fixhang.plist

2 votos

Para cualquier otra persona que quiera usar el fixHang.sh, recuerde reemplazar /Users/Michael/loginwindowdaemonscript.txt con el lugar donde desee que esté su archivo de registro. Obviamente, cambie Michael por cualquiera que sea su nombre de usuario.

1voto

Dev Puntos 3

Conozco a la comunidad de StackExchange tiende a odiar este tipo de respuestas, pero no sé exactamente qué arregló mi problema.

loginwindow ahora está finalizando hilos correctamente. Es decir, en algún momento tenía menos hilos que antes, y ahora está alrededor de 2-3.

Jugué con los kexts y LaunchDaemons. Desinstalé ciertas cosas, como Karabiner Elements, y el controlador de audio de Camtasia. Deshabilité ciertos elementos de inicio, como SIMBL. Pero no sé exactamente qué arregló el problema.

Si alguien más con este problema tiene alguno de estos mismos softwares, recomendaría intentar deshabilitar algunos en /Library/LaunchDaemons. (/Library/Extensions para kexts)

0voto

Chris N Puntos 11

SIMBL es probablemente la causa de tus problemas. Era cuestionable cuando era popular. Me sorprende si ha sido actualizado correctamente para funcionar en Mojave en este momento.

Los antiguos controladores de audio también podrían ser sospechosos, además de los antiguos kexts que siempre son posibles sospechosos ya que Apple realiza grandes cambios en el sistema para estos, lo cual han hecho mucho en los últimos años para seguridad y ahorro de energía.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X