El inicio de sesión del terminal se bloquea

21

Tengo un problema extraño en mi nueva MacBook Pro (finales de 2016, barra táctil).

Funciona bien y luego, después de usarlo por un tiempo, abrir nuevas ventanas de Terminal no funciona porque login se bloquea. El reinicio soluciona el problema.

Este parece ser un problema que otras personas han tenido, así que ya probé todas sus soluciones (desde 1 y [2] ):

  1. Eliminando ~/Library/Preferences/com.apple.Terminal.plist
  2. Establecer mi shell predeterminado en otro shell (de /bin/zsh a /bin/sh o /bin/bash )
  3. Eliminando o limpiando mi .profile , .zprofile , ... Esto no funciona y puedo validar que el problema ocurre incluso antes de que se invoque el shell, porque si echo HEY es la primera línea de mi .zshenv esto ni siquiera se alcanza. Debe ser login causando los problemas. La edición de /etc/profile para agregar un eco en la parte superior tampoco muestra nada
  4. Cambiar la configuración de Run command: en la configuración de mi Terminal a algo como echo foo tampoco funciona (dejar Run inside shell activado o desactivado no cambia nada).

Otras notas:

  • Me gusta [2] , ssh-add -K no conserva las claves entre reinicios, algo con lo que nunca antes tuve problemas.
  • La consola no muestra ningún error o advertencia sospechosa.
  • Al abrir una nueva ventana Terminal parece crear un archivo tty ( /dev/ttys<number> ).
  • Cuando esto ocurre, no importa si uso Terminal.app o iTerm.app
  • Tengo una instalación bastante limpia (solo conseguí mi computadora portátil, no restauré ninguna copia de seguridad, solo instalé algunas aplicaciones con brew install y brew cask install ).

Esto es realmente difícil de depurar porque no puedo reproducirlo y, a menudo, no puedo abrir una nueva terminal para intentar averiguar qué está pasando.

¿Alguien tiene algún consejo?

Actualización:

Usando iTerm, pude obtener un shell configurando el comando de inicio en /bin/bash . En este shell, sin embargo, sudo no funciona. Se bloquea (sin mostrar el indicador) y ctrl-C y ctrl-D no funcionan cuando se bloquea.

El uso de algunos otros programas tampoco funciona en este shell: node o /usr/local/bin/node se cuelgan. Por lo que puedo decir, son programas que están en /usr/local/bin .

Actualización 2:

brew list --full-name resulta en estos paquetes:

autoconf
automake
blueutil
boost
cabal-install
cairo
cfssl
cmake
coreutils
doxygen
editorconfig
erlang
ffind
ffmpeg
flow
fontconfig
fontforge
freetype
gdbm
gettext
ghc
git
glib
go
gobject-introspection
graphicsmagick
harfbuzz
haskell-stack
highlight
icu4c
influxdb
jemalloc
jpeg
keybase
lame
libevent
libffi
libpng
libtermkey
libtiff
libtool
libuv
libvterm
libxml2
lua
mongodb
msgpack
nginx
node
openssl
[email protected]
pango
pcre
pixman
pkg-config
postgresql
protobuf
python
python3
rabbitmq
readline
reattach-to-user-namespace
redis
sqlite
the_silver_searcher
thefuck
tmux
unibilium
unixodbc
wxmac
x264
xvid
xz
yarn
z
zsh
josegonzalez/php/php54
neovim/neovim/neovim

Actualización 3:

Estos puntos están en correspondencia con la respuesta de @Monomeeth:

  1. Cuando sucede, un elemento login se muestra en el monitor de actividad. (Forzar) Al salir también se cierra la ventana de la Terminal que estaba colgada. Cerrar la ventana manualmente no hace que el proceso login desaparezca en el Monitor de actividad.

  2. El título del terminal es Terminal — login — term big — ttys001 — 89x18 — ⌘1 , donde term big es el nombre de la configuración.

  3. No se muestra ningún proceso sudo en el Monitor de actividad. Puedo crear un proceso sudo abriendo iTerm.app (que usa bash) y ejecutando sudo echo ok allí. No se puede Salir, pero Forzar Salir funciona y lo mata:

    bash-3.2 $ sudo echo ok Muerto: 9

Actualización 4:

Cuando sucede, la ejecución de login desde un shell que todavía está disponible funciona , mientras que login en shells más recientes parece bloquearse.

Actualización 5:

Hace poco recibí una nueva computadora portátil (MacBook Pro 2017, no Touch Bar) y el problema persiste.

También cambié shells: ahora estoy usando fish con una bonita configuración de vainilla. Creo que eso descarta que la cáscara sea la culpable.

El sistema operativo también se ha actualizado a 10.13.3 (17D47) High Sierra.

He intentado instalar lo menos posible en esta máquina:

brew list —-full-names

coreutils 8.29
dnsmasq 2.78
faac 1.29.9.2
fdk-aac 0.1.5
ffmpeg 3.4.1
fish 2.7.1
freetype 2.9
gdbm 1.14.1_1
gettext 0.19.8.1
git 2.16.1
highlight 3.42
htop 2.0.2_2
icu4c 60.2
imagemagick 7.0.7-22
jemalloc 5.0.1
jpeg 9b
lame 3.100
libav 12.2
libogg 1.3.3
libpng 1.6.34
libtermkey 0.20
libtiff 4.0.9_1
libtool 2.4.6_1
libuv 1.19.1
libvorbis 1.3.5_1
libvpx 1.7.0
libvterm 681
libyaml 0.1.7
lua 5.3.4_2
luajit 2.0.5
mongodb 3.6.2
msgpack 2.1.5
neovim 0.2.2
node 9.5.0
openssl 1.0.2n
opus 1.2.1
parallel 20180122
pcre 8.41
pcre2 10.30
postgresql 10.2
python 2.7.14_3
python3 3.6.4_2
readline 7.0.3_1
ripgrep 0.7.1
ruby 2.5.0
sqlite 3.22.0
the_silver_searcher 2.1.0
thefuck 3.25_1
unibilium 1.2.1
x264 r2795
xvid 1.3.5
xz 5.2.3
youtube-dl 2018.02.08

No estoy seguro de lo que esto puede ser ahora. Las únicas aplicaciones que se me ocurren son Divvy o Apptivate ya que ambas parecen desactualizadas. Esta es la intersección de lo que se instaló en la máquina antigua frente a la nueva:

coreutils
ffmpeg
freetype
gdbm
gettext
git
highlight
icu4c
jemalloc
jpeg
lame
libpng
libtermkey
libtiff
libtool
libuv
libvterm
lua
mongodb
msgpack
node
openssl
pcre
postgresql
python
python3
readline
sqlite
the_silver_searcher
thefuck
unibilium
x264
xvid
xz

Actualización 6:

También, aquí hay una captura de pantalla:

Actualización 7:

Mi env normalmente se ve así:

Apple_PubSub_Socket_Render=/private/tmp/com.apple.launchd.k60Nf5UBfq/Render
DISPLAY=/private/tmp/com.apple.launchd.6FMoWPSlJI/org.macosforge.xquartz:0
EDITOR=env VIRTUAL_ENV= nvim -u /Users/john-doe/.config/vim/vimrc -p
GNUTERM=X11
HOME=/Users/romeo
HOMEBREW_NO_EMOJI=1
HOMEBREW_PREFIX=/usr/local
LANG=en_GB.UTF-8
LESS=-RI
LESSHISTFILE=-
LOGNAME=romeo
LS_COLORS=di=00;31:ex=00;37:mi=00;41;30:tw=00;33
MANPATH=/usr/local/opt/coreutils/libexec/gnuman
PAGER=less
PATH=/Users/john-doe/.config/fisherman/re-search:/usr/local/opt/python/libexec/bin:/usr/local/opt/ruby/bin:/usr/local/opt/coreutils/libexec/gnubin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin:/usr/local/MacGPG2/bin
PWD=/Users/romeo
SECURITYSESSIONID=186a8
SHELL=/usr/local/bin/fish
SHLVL=1
SSH_AUTH_SOCK=/private/tmp/com.apple.launchd.fQn5sHMuZP/Listeners
TERM=xterm-256color
TERM_PROGRAM=Apple_Terminal
TERM_PROGRAM_VERSION=400
TERM_SESSION_ID=D2AF7A50-8B41-4793-9201-8304A02C9B29
TMPDIR=/var/folders/15/zcyyfw_x7638z7vfg5zd85z40000gn/T/
USER=romeo
XDG_CACHE_HOME=/Users/john-doe/.cache
XDG_CONFIG_HOME=/Users/john-doe/.config
XPC_FLAGS=0x0
XPC_SERVICE_NAME=0
    
pregunta romeovs 06.01.2017 - 17:51

8 respuestas

11

Como estoy seguro de que saben, la solución de problemas es un proceso de eliminación y, a menudo, requiere un poco de paciencia. Me gustaría probar algunas cosas para intentar llegar al fondo de esto por usted.

1. Confirme que se cuelga durante el inicio de sesión

Si el proceso en el que se cuelga es realmente durante login , esto implica que el proceso todavía está esperando para crear una sesión de inicio de sesión. Suponiendo que este sea el caso, entonces no habría intentado iniciar el shell todavía.

Para confirmar esto, la próxima vez que experimente este problema, inicie el Monitor de actividad para verificar si el shell se está ejecutando o si solo ve un proceso de inicio de sesión .

Una vez que haya tenido la oportunidad de hacer esto, informe con lo que encontró.

NOTA: - si tiene otros terminales abiertos, asegúrese de verificar el proceso correspondiente. Mi conjetura es que el proceso de clasificación es el que tiene el número de ID de proceso (PID) más alto.

2. ¿Qué es el título de Terminal?

La próxima vez que tenga este problema, ¿puede tomar nota de lo que es el título de la ventana de Terminal y volver a informar?

3. Mata sudo

Dice que reiniciar su MBP siempre resuelve este problema.

Sin embargo, la próxima vez que tenga este problema (tal vez después de hacer lo que describí en el punto 1 anterior), me gustaría que intentara matar el sudo desde el Monitor de actividad.

Una vez que hayas probado esto, dinos qué sucede.

4. Intenta mover tus archivos .bash *

Es posible (por varias razones) que tenga un archivo .bash_profile en su directorio de usuarios y esto está causando problemas intermitentes. Esto es algo que quizás ni conozcas, pero puedes usar Automator para ejecutar un script que encuentra y mueve cualquier archivo .bash.

Aquí hay un script de ejemplo para hacer esto:

cd ~

mkdir moved
for F in .bash*
do
    mv $F moved
done

Esta secuencia de comandos mueve todos los archivos que comienzan con .bash en la carpeta de inicio a una subcarpeta movida recién creada.

Después de ejecutar el script, verifique esta carpeta y háganos saber si de hecho tiene algún archivo en ella.

NOTA: - puede etiquetar la nueva subcarpeta como desee. Para hacerlo, simplemente cambia las dos apariciones de movidas en el script a la etiqueta que quieras usar.

[UPDATE◆

Algunas cosas más para probar.

5. Intenta borrar los archivos * .asl

Si aún no lo ha hecho, intente borrar los archivos * .asl. Para hacer esto usa lo siguiente:

sudo rm -rf /private/var/log/asl/*.asl

NOTA: - Esto puede llevar algo de tiempo ya que crea un nuevo shell. Cuando termine, asegúrese de salir completamente de la Terminal para que los cambios surtan efecto.

6. Modo seguro

¿Observa alguna diferencia en el comportamiento cuando inicia su MBP en Modo seguro? Para arrancar en modo seguro:

  1. Apaga completamente tu Mac
  2. Reinicia tu Mac
  3. Inmediatamente presione la tecla Shift y manténgalo presionado
  4. Suelte la tecla Shift cuando vea la ventana de inicio de sesión (NOTA: si tiene FileVault habilitado, es posible que deba iniciar sesión dos veces).
  5. Una vez que su MBP se inicie, intente usar Terminal y vea si aún puede replicar el problema.
  6. Cuando haya terminado, puede salir del Modo seguro reiniciando su MBP de manera normal

7. Directorio abierto

Es probable que esto no se aplique a su caso ya que no lo menciona, pero si está conectado a una red de Open Directory, esto también podría estar causándole problemas. Por lo general, esto solo implicaría esperar entre 10 y 15 segundos, pero he visto informes de inicios de sesión en terminales que tardan cinco o más minutos en completarse en esta situación.

    
respondido por el Monomeeth 18.01.2017 - 07:58
7

Esto parece ser un ajuste perfecto para usted que excede los procesos máximos por usuario (o posiblemente los procesos máximos).

En una instalación de macOS en stock, obtienes 709 por usuario ( ulimit -u ) y 1064 procesos máximos ( sysctl -a | grep maxp )

Una forma fácil de aumentar estos errores es instalar Server.app desde la App Store y luego reiniciar. También puede establecer el modo de rendimiento para límites más altos.

Como no describió su configuración (versión del sistema operativo y compilación), aquí hay algunos consejos: asegúrese de verificar que SIP restrinja su capacidad para cambiar archivos si lee algunos de los artículos anteriores sobre cómo cambiar los límites sin tener que recurrir a instalando server.app:

respondido por el bmike 24.01.2017 - 05:47
5

Es importante tratar el problema real y no solo el síntoma. Por lo tanto, pruebe las siguientes sugerencias y actualice, de manera que también se pueden sugerir soluciones adicionales.

  1. ¿Qué usuario posee el terminal? : Mi primer presentimiento es que esto puede estar relacionado con la forma en que se configura su cuenta. Si la terminal está tratando de acceder a los recursos o directorios que solo el usuario administrador puede (si su cuenta no es de administración), eso puede provocar un estado de congelación, lo que no le permitirá acceder a la terminal. Así que adelante y asegúrese de que cuando comienza una sesión de terminal, es local para su usuario y no para otro usuario. El hecho de que no pueda crear un proceso sudo, me está indicando esta dirección.

  2. Type Control-Z o Command-Z:
    Esta secuencia de teclas de control suspende un programa que puede estar ejecutándose y le brinda un indicador de shell. Ahora puede ingresar el comando jobs para buscar el nombre del programa, luego reinicie el programa con fg o finalícelo con kill.

  3. Presiona Comando-C :
    Esto se interrumpirá si el terminal está intentando ejecutar un programa en segundo plano. Inténtalo un par de veces. Tenga en cuenta si ve alguna salida

  4. Type Control-Q :
    Si la salida se ha detenido con Control-S, esto se reiniciará.

  5. Obtén un shell alternativo :
    Si desea probar un shell diferente durante unos días, sus comportamientos a veces pueden ayudarlo a comprender el problema con el terminal dado si actúan de cierta manera. Consulte los siguientes enlaces para ver alternativas

enlace
enlace

Ayudará a saber lo siguiente, si no se ha mencionado ya:

  • ¿Cómo está iniciando la sesión de terminal? ¿Esto es a través de Spotlight o un ícono de escritorio o de alguna otra manera?

  • ¿Qué está haciendo la terminal cuando se cuelga? ¿Está en medio de ejecutar un comando (el mismo comando cada vez antes de que se cuelgue) o simplemente se cuelga desde el momento en que inicia una sesión / ventanas de terminal?

  • ¿Para qué usas habitualmente tu terminal? Si la mayoría de su uso es solo para comandos relacionados con git, sugeriría usar Algo como Github para Mac , ya que generalmente puede hacer la mayoría de las cosas de allí.

respondido por el pal4life 22.01.2017 - 09:02
4

Intentaría deshabilitar SIP y dtrace para encontrar la causa raíz (Para deshabilitar y volver a habilitar SIP, consulte enlace )

$ csrutil status
System Integrity Protection status: disabled.
$ cp /usr/bin/login /tmp
$ sudo dtruss /tmp/login

Tratando de darte un ejemplo de salida, acabo de descubrir que las cosas son mucho más simples de lo que pensaba. No es necesario deshabilitar SIP, simplemente copie el inicio de sesión.

dtuss devolverá las llamadas del sistema y podría dar una pista de dónde van las cosas mal.

cp /usr/bin/login .
sudo ls

da tu contraseña. Entonces haz

sudo dtruss -d -e ./login 2> dtruss_login.txt

ingrese su nombre de usuario, presione enter

ingrese su contraseña, presione enter

ingrese 'exit', presione enter

y finalmente suba dtruss_login.txt a, por ejemplo, enlace

Puede copiar el contenido del archivo en el portapapeles de esta manera

cat dtruss_login.txt | pbcopy

Puede encontrar un inicio de sesión de ejemplo aquí: enlace

El segundo entero en cada línea es el tiempo que tomó la llamada.

Por supuesto, sería genial si pudieras ejecutar esto cuando se cuelgue el inicio de sesión, pero si lo entiendo bien, esto es imposible ... tal vez tú o alguien más tenga una idea de cómo "iniciar sesión" cuando la terminal cuelga?

    
respondido por el user2707001 24.01.2017 - 16:59
4

También he estado viendo esto desde hace varios meses. Extremadamente frustrante. Lo único que lo soluciona es reiniciar.

  • Mediados de 2015 MBP (sin barra táctil)
  • MacOS 10.12.6 beta

A veces, los bloqueos de inicio de sesión se producen después de interactuar con tmux.

He intentado sin éxito todos los enfoques recomendados.

No estoy seguro de si está relacionado, pero lsof -p LOGIN_PID muestra un archivo bastante masivo /private/var/db/dyld/dyld_shared_cache_x86_64h para el proceso de inicio de sesión bloqueado.

8/29/2017 Actualización:

Todavía tengo el problema. A veces, cuando la máquina se encuentra en mal estado, tengo ventanas de terminal abiertas que ya han iniciado sesión correctamente y que puedo usar para depurar.

Muchos comandos no se ejecutan correctamente, pero todos muestran un patrón de tener problemas para escribir (en la versión estándar, estoy pensando). Por ejemplo, cuando ejecuto ls -al , veo ls: write error emitido a stderr. Cuando ejecuto ls -al > /dev/null , no se imprime nada en stderr.

    
respondido por el Zack 01.06.2017 - 00:18
1

El código fuente del comando login ha sido publicado por Apple. El sitio web es macOS 10.13.3 Source . La única descarga requerida es system_cmds-790.30.1 . Una vez descargado, el proyecto se puede modificar fácilmente para generar solo el comando login . El proyecto modificado y el comando login se han colocado en GitHub en davidanderson61 / system_cmds-10.13.3 .

La idea aquí es modificar login para escribir información de depuración en la Consola. Esto ayudaría a determinar por qué se cuelga el comando login . Las modificaciones se pueden realizar a quien desee participar. Asumí que este habría sido yo.

Instalar el comando Debug login .

  1. Seleccione el último lanzamiento del sitio web davidanderson61 / system_cmds-10.13.3 / releases .

  2. Descargue el comando debug login en su carpeta Downloads . Debajo de "Recursos", haga clic con el botón derecho en login y seleccione "Descargar archivo vinculado como", luego seleccione "Guardar".

  3. Parcialmente, deshabilite la protección de integridad del sistema (SIP). El comando se da a continuación. Antes de ingresar el comando, deberá iniciar una macOS Recover , luego una ventana de Terminal.

    csrutil  enable  --without  fs
    
  4. Ingrese el comando dado a continuación para guardar el comando login original. Si login.orignal ya existe, puede omitir este paso.

    sudo  mv  /usr/bin/login  /usr/bin/login.original
    
  5. Ingrese los comandos que se indican a continuación para copiar el comando debug login y establecer los permisos adecuados.

    sudo  cp  ~/Downloads/login  /usr/bin/login
    sudo  chmod  104555  /usr/bin/login
    
  6. Habilitar la protección de integridad del sistema (SIP). Ingrese el siguiente comando. Después, debes reiniciar.

    sudo  csrutil  clear
    

Configurar la aplicación de consola

A continuación se muestran los pasos para configurar la aplicación de la Consola para mostrar solo los mensajes del comando login .

  1. Abre la aplicación de la Consola.
  2. Agregue una columna PID , como se muestra a continuación.

  3. Ingreseloginenelcampodebúsqueda.

    Mientraselcampodebúsquedatieneelfoco,presionelateclareturn.Elcampodebúsquedadebecambiaraloquesemuestraacontinuación.

  4. CambieAnyaProcess,comosemuestraacontinuación.

  5. ElcambiodelistaContainsaEquals,comosemuestraacontinuación.

  6. SeleccionaelbotónSave.Cuandoselesolicite"Guardar búsqueda como:", ingrese Login , luego seleccione Save .

Losresultadosdebenaparecercomosemuestraacontinuación.LapróximavezqueabralaaplicacióndelaConsola,solotendráqueseleccionarelbotón"Iniciar sesión".

Apéndice

CómosecreóelrepositorioGitHub.

  1. Hagaclicenelarchivosystem_cmds.xcodeprojabiertoenXcode.
  2. Enlabarrademenú,seleccioneSourceControl->CreateGitRepositories....
  3. Enlabarrademenú,seleccioneProduct->Scheme->NewScheme....Acontinuación,seleccionelogincomoobjetivoynombre.
  4. Enlabarrademenú,seleccioneProject->Build.
  5. SalirdeXcode.
  6. IniciesesiónenGitHubycreeunnuevorepositorio.
  7. EnlapartesuperiordelapáginadeconfiguraciónrápidadesurepositorioGitHub,hagaclicen para copiar la URL del repositorio remoto.
  8. Para una ventana de aplicación de Terminal, ingrese el siguiente comando. Reemplace <remote repository URL> con la URL copiada en el paso anterior.

    git  remote  add  origin  <remote repository URL>
    
  9. Abra el proyecto en Xcode y en la barra de menú, seleccione Source Control->Push... .

Cómo se creó la primera versión

  1. Desde una ventana de aplicación de Terminal, ingrese los siguientes comandos.

    git  tag  -a  v1.0  -m  "Original source code"
    git  push  origin  v1.0
    
  2. Copie el comando login creado en su carpeta Downloads .

  3. Desde su cuenta de GitHub, cree una nueva versión como v1.0 . Adjunte ~/Downloads/login como binario.

respondido por el David Anderson 20.02.2018 - 21:51
0

También tuve este problema al ejecutar la consola sbt en emacs. Cada vez que salía de la consola de sbt simplemente al matar la ventana en lugar de salir de la consola de sbt "muy bien" primero, causaba que el proceso Java se bloqueara incluso después de cerrar la ventana, y de alguna manera impedía que se crearan nuevas sesiones de terminal. Forcé el proceso java desde el monitor de actividad y el terminal colgado se inició, desde Emacs y en una nueva pestaña.

Ahora, me aseguro de salir bien usando el comando exit o ctrl-d (o ctrl-c ctrl-d en emacs term/multi-term ), luego elimine la ventana.

    
respondido por el jjinking 08.05.2018 - 05:05
0
  1. Comprueba si tu proceso se bloquea realmente durante login
  2. Observe el Monitor de actividad y tenga cuidado con los procesos root (es decir, nano, emacs, vim) que pudo haber iniciado y no se ha cerrado correctamente (falla, acaba de matar el terminal, etc.) y sigue siendo corriendo.
  3. Detenga este proceso (s) y el inicio de sesión debería funcionar de inmediato.
respondido por el user5795782 26.09.2018 - 17:07

Lea otras preguntas en las etiquetas