35 votes

Connexion au terminal bloquée

J'ai un problème étrange sur mon nouveau MacBook Pro (fin 2016, avec Touch Bar).

Tout fonctionne bien et puis, après l'avoir utilisé un moment, l'ouverture de nouvelles fenêtres de Terminal ne fonctionne pas car login se bloque. Le redémarrage résout le problème.

Cela semble être un problème que d'autres personnes ont rencontré, donc j'ai déjà essayé toutes leurs solutions (de 1 et [2]) :

  1. Supprimer ~/Library/Preferences/com.apple.Terminal.plist
  2. Définir mon shell par défaut sur un autre shell (de /bin/zsh à /bin/sh ou /bin/bash)
  3. Supprimer ou nettoyer mon .profile, .zprofile, ... Cela ne fonctionne pas et je peux valider que le problème survient avant même que le shell soit invoqué, car si j'ajoute echo HEY comme première ligne de mon .zshenv, cela n'est même pas atteint. Ce doit être login qui pose problème. Modifier /etc/profile pour ajouter un echo en haut ne montre rien
  4. Changer le paramètre Exécuter la commande : dans ma configuration de Terminal pour quelque chose comme echo foo ne fonctionne pas non plus (cocher ou décocher Exécuter à l'intérieur du shell ne change rien).

Autres notes :

  • Comme mentionné dans [2], ssh-add -K ne conserve pas les clés entre les redémarrages, quelque chose que je n'avais jamais eu de problèmes auparavant.
  • La console ne montre aucun erreur ou avertissement suspect.
  • Ouvrir une nouvelle fenêtre de Terminal semble créer un fichier tty (/dev/ttys).
  • Quand cela se produit, cela n'a pas d'importance si j'utilise Terminal.app ou iTerm.app
  • J'ai une installation plutôt propre (je viens de recevoir mon ordinateur portable, je n'ai pas restauré de sauvegardes, juste installé quelques applications avec brew install et brew cask install).

C'est vraiment difficile à déboguer car je ne peux pas le reproduire et souvent je ne peux pas ouvrir un nouveau terminal pour essayer même de comprendre ce qui se passe.

Est-ce que quelqu'un a des conseils?

Mise à jour :

En utilisant iTerm, j'ai réussi à obtenir un shell en définissant la commande de démarrage sur /bin/bash. Dans ce shell, cependant, sudo ne fonctionne pas. Il se bloque (sans afficher le prompt) et ctrl-C et ctrl-D ne fonctionnent pas quand il se bloque.

L'utilisation de certaines autres applications ne fonctionne pas dans ce shell : node ou /usr/local/bin/node restent bloqués. Autant que je puisse le dire, ce sont des programmes qui se trouvent dans /usr/local/bin.

Mise à jour 2 :

brew list --full-name donne ces paquets :

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
openssl@1.1
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

Mise à jour 3 :

Ces points correspondent à la réponse de @Monomeeth :

  1. Quand cela se produit, un élément login apparaît dans le moniteur d'activité. (Forcer) Quitter le ferme également la fenêtre Terminal qui était bloquée. Fermer manuellement la fenêtre ne fait pas disparaître le processus login dans le moniteur d'activité.

  2. Le titre du terminal est Terminal — login — term big — ttys001 — 89x18 — 1, où term big est le nom des paramètres.

  3. Aucun processus sudo n'apparaît dans le moniteur d'activité. Je peux créer un processus sudo en ouvrant iTerm.app (qui utilise bash) et en exécutant sudo echo ok là-bas. Il ne peut pas être fermé, mais Forcer à quitter fonctionne et le tue :

    bash-3.2$ sudo echo ok Killed: 9

Mise à jour 4 :

Quand cela se produit, exécuter login depuis un shell toujours disponible fonctionne, tandis que le login dans les nouveaux shells semble se bloquer.

Mise à jour 5 :

J'ai récemment acquis un nouvel ordinateur portable (MacBook Pro 2017, sans Touch Bar) et le problème persiste.

J'ai également changé de shell : j'utilise maintenant fish avec une configuration assez basique. Je pense que cela exclut le shell comme étant le coupable.

Le système d'exploitation a aussi été mis à jour en 10.13.3 (17D47) High Sierra.

J'ai essayé d'installer le moins possible sur cette machine :

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

Je ne sais pas ce que cela peut être maintenant. Les seules applications auxquelles je peux penser sont Divvy ou Apptivate car elles semblent toutes deux obsolètes. Voici l'intersection de ce qui était installé sur l'ancien vs le nouveau machine:

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

Mise à jour 6 :

Aussi, voici une capture d'écran :

capture d'écran

Mise à jour 7 :

Mon environnement ressemble typiquement à ceci :

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

2 votes

Ceci pourrait être une suggestion simpliste, mais avez-vous essayé de contacter le support client d'Apple? Votre question n'a pas obtenu beaucoup d'attention depuis que vous l'avez postée, et leur équipe de support pourrait être au courant de ce problème. Ma seule autre suggestion serait de réinstaller MacOS. Cependant, étant donné que votre Mac est si récent, je ne sais pas si cela fonctionnerait.

1 votes

@klanomath terminé!

0 votes

Pour comprendre ce que fait le processus de connexion, sélectionnez-le dans le Moniteur d'activité et choisissez Échantillon de processus. Il en va de même pour les autres processus bloqués. Cependant, ce niveau de débogage peut ne pas être approprié pour une question et réponse sur StackExchange. Il peut être préférable de signaler un bogue à Apple en incluant le fichier d'échantillon, ou de trouver quelqu'un qui peut offrir un support pour diagnostiquer le problème à ce niveau. Voir developer.apple.com/bug-reporting

14voto

Monomeeth Points 61435

Comme vous le savez sûrement, le dépannage est un processus d'élimination et nécessite souvent beaucoup de patience. J'aimerais essayer quelques choses pour essayer de résoudre ce problème pour vous.

1. Confirmez s'il bloque pendant la connexion

Si le processus bloque réellement pendant la connexion, cela implique que le processus est toujours en attente pour créer une session de connexion. En supposant que c'est le cas, alors il n'aurait pas encore essayé de démarrer le shell.

Pour confirmer cela, la prochaine fois que vous rencontrez ce problème, lancez le Moniteur d'activité pour vérifier si le shell est en cours d'exécution ou si vous ne voyez qu'un processus de connexion.

Une fois que vous avez eu l'occasion de le faire, revenez vers nous avec ce que vous avez trouvé.

REMARQUE:- Si vous avez d'autres terminaux ouverts, assurez-vous de vérifier le processus correspondant. Je suppose que le processus bloquant est celui avec le numéro d'identifiant de processus (PID) le plus élevé.

2. Quel est le titre du Terminal ?

La prochaine fois que vous rencontrez ce problème, pourriez-vous prendre note du titre de la fenêtre du Terminal et nous le rapporter ?

3. Arrêtez sudo

Vous mentionnez que redémarrer votre MBP résout toujours ce problème.

Cependant, la prochaine fois que vous rencontrez ce problème (peut-être après avoir fait ce que j'ai décrit au point 1 ci-dessus), je vous invite à essayer d'arrêter sudo depuis le Moniteur d'activité.

Une fois que vous avez essayé cela, dites-nous ce qu'il se passe.

4. Essayez de déplacer vos fichiers .bash*

Il est possible (pour diverses raisons) que vous ayez un fichier .bash_profile dans votre répertoire utilisateur et que cela cause des problèmes intermittents. C'est quelque chose dont vous n'êtes peut-être même pas conscient, mais vous pouvez utiliser Automator pour exécuter un script qui trouve et déplace tous les fichiers .bash.

Voici un script exemple pour cela :

cd ~

mkdir déplacé
pour F dans .bash*
faire
    mv $F déplacé
fait

Ce script déplace tous les fichiers commençant par .bash dans votre dossier utilisateur vers un sous-dossier déplacé> nouvellement créé.

_

Après avoir exécuté le script, vérifiez ce dossier et dites-nous si vous avez en fait des fichiers dedans.

REMARQUE:- Vous pouvez nommer le nouveau sous-dossier comme bon vous semble. Pour cela, il suffit de changer les deux occurrences de déplacé> dans le script par le libellé que vous souhaitez utiliser.

_

[MISE À JOUR]

Quelques autres choses à essayer.

5. Essayez de vider les fichiers *.asl

Si vous ne l'avez pas déjà fait, essayez de vider les fichiers *.asl. Pour ce faire, utilisez la commande suivante :

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

REMARQUE:- Cela peut prendre un certain temps car cela crée un nouveau shell. Une fois terminé, assurez-vous de quitter complètement le Terminal pour que les changements prennent effet.

6. Mode sans échec

Remarquez-vous une différence de comportement lorsque vous démarrez votre MBP en mode sans échec ? Pour démarrer en mode sans échec :

  1. Éteignez complètement votre Mac
  2. Redémarrez votre Mac
  3. Appuyez immédiatement sur la touche Shift et maintenez-la enfoncée
  4. Relâchez la touche Shift lorsque vous voyez la fenêtre de connexion (REMARQUE : Si vous avez activé FileVault, vous devrez peut-être vous connecter deux fois).
  5. Une fois que votre MBP démarre, essayez d'utiliser le Terminal et voyez si vous parvenez toujours à reproduire le problème?
  6. Une fois terminé, vous pouvez quitter le mode sans échec en redémarrant votre MBP normalement

7. Répertoire ouvert

Cela ne s'applique probablement pas dans votre cas puisque vous ne le mentionnez pas, mais si vous êtes connecté à un réseau Open Directory, cela pourrait également causer des problèmes. Habituellement, cela impliquerait seulement d'attendre environ 10 à 15 secondes, mais j'ai vu des rapports de connexions terminales prenant cinq minutes ou plus pour se terminer dans cette situation.

__

0 votes

Merci! J'utilise zsh, et même avec un .zshrc vide, .zprofile, .profile, etc ça ne se produit pas, de plus cela n'explique pas pourquoi d'autres programmes dans /usr/local/bin ralentissent également, donc je pense que 4. est hors de propos. Je reviendrai avec la réponse aux autres questions une fois que je les aurai obtenues.

0 votes

J'ai ajouté une mise à jour avec les réponses à ces questions. login semble être le coupable, mais cela n'explique toujours pas pourquoi cela fonctionne dans iTerm avec bash.

0 votes

J'ai mis à jour ma réponse. Cependant, je viens de réaliser que vous n'avez pas indiqué depuis combien de temps vous avez attendu que la connexion au terminal se termine ? Il serait bon de savoir si elle finit par se connecter, ou si elle reste indéfiniment bloquée.

6voto

Oskar Points 1242

Cela semble être un ajustement parfait pour vous dépassant le maximum de processus par utilisateur (ou éventuellement le maximum de processus).

Sur une installation standard de macOS, vous obtenez 709 par utilisateur (ulimit -u) et 1064 processus maximum (sysctl -a | grep maxp)

Une façon simple d'augmenter ces limites est d'installer Server.app depuis l'App Store, puis de redémarrer. Vous pouvez également définir le mode performances pour des limites plus élevées.

Étant donné que vous n'avez pas décrit votre configuration (version et build du système d'exploitation), voici quelques conseils - assurez-vous de vérifier si SIP restreint votre capacité à modifier des fichiers si vous lisez certains des anciens articles sur la modification des limites sans recourir à l'installation de Server.app:

0 votes

Excellent point! Je n'avais même pas envisagé cela. :)

0 votes

@Monomeeth ta réponse est géniale. Beaucoup de choses intéressantes à l'intérieur.

0 votes

@bmike Y a-t-il un moyen pour moi de vérifier le nombre total de processus pour vérifier que c'est le cas ? Peut-être que je peux même le reproduire en créant 709 processus alors ?

5voto

Patrick Points 91

J'ai aussi vu cela depuis plusieurs mois maintenant. Extrêmement frustrant. La seule chose qui le corrige est de redémarrer.

  • MBP mi-2015 (sans barre tactile)
  • MacOS 10.12.6 beta

Parfois, les blocages de connexion se produisent après avoir interagi avec tmux.

J'ai essayé sans succès toutes les approches recommandées.

Je ne suis pas sûr si c'est lié, mais un lsof -p ID_LOGIN montre un fichier assez massif /private/var/db/dyld/dyld_shared_cache_x86_64h pour le processus de connexion bloqué.

Mise à jour le 29/08/2017:

Le problème persiste. Parfois, lorsque la machine se trouve dans un mauvais état, j'ai des fenêtres de terminal ouvertes qui sont déjà connectées avec succès et que je peux utiliser pour déboguer.

De nombreuses commandes ne s'exécutent pas correctement, mais elles montrent toutes un problème d'écriture (je pense à stdout). Par exemple, lorsque je lance ls -al, je vois ls: error d'écriture émis sur stderr. Lorsque je lance ls -al > /dev/null, rien n'est imprimé sur stderr.

0 votes

Avez-vous eu de la chance pour trouver une solution à cela?

0 votes

Le problème est résolu pour moi depuis la mise à jour de mon OS. Il a été corrigé pour quelques versions mineures, et je suis actuellement en train de faire tourner la version 10.13.3 (17D47).

0 votes

Je cours aussi sur 10.13.3 (17D47) ! Cela est devenu moins fréquent, mais cela arrive encore parfois.

4voto

pal4life Points 261

Il est important de traiter le vrai problème et non seulement le symptôme. Alors essayez les suggestions suivantes et mettez à jour afin que nous puissions suggérer d'autres remèdes également.

  1. Quel utilisateur possède le terminal?:
    Mon premier pressentiment est que cela peut être lié à la façon dont votre compte est configuré. Si le terminal essaie d'accéder aux ressources ou répertoires que seul l'utilisateur administrateur peut (si le vôtre est un compte non administrateur), cela peut entraîner un état de gel - ne vous permettant pas d'accéder au terminal. Alors assurez-vous que lorsque vous commencez une session de terminal, elle est locale à votre utilisateur et non à un autre utilisateur. Le fait que vous ne puissiez pas créer de processus sudo me dirige dans cette direction.

  2. Tapez Control-Z ou Command-Z:
    Cette séquence de touches de contrôle suspend un programme qui peut être en cours d'exécution et vous donne un invite de commande shell. Maintenant vous pouvez entrer la commande jobs pour trouver le nom du programme, puis redémarrer le programme avec fg ou le terminer avec kill.

  3. Appuyez sur Command-C:
    Cela interrompra si le terminal essaie d'exécuter un programme en arrière-plan. Essayez-le quelques fois. Notez si vous voyez une quelconque sortie

  4. Tapez Control-Q:
    Si la sortie a été arrêtée avec Control-S, cela la redémarrera.

  5. Obtenez un shell alternatif:
    Si vous voulez essayer un shell différent pendant quelques jours, leurs comportements peuvent parfois vous aider à comprendre le problème avec le Terminal étant donné s'ils agissent d'une certaine manière. Consultez ces liens ci-dessous pour des alternatives

https://git-scm.com/downloads/guis
https://computers.tutsplus.com/tutorials/beyond-terminal-4-os-x-terminal-alternatives--mac-56217

Aidera à savoir ce qui suit, si ce n'est pas déjà mentionné:

  • Comment initiez-vous la session du terminal? Est-ce via spotlight, une icône sur le bureau ou d'une autre manière?

  • Que fait le terminal quand il se fige? Est-ce en train d'exécuter une commande (même commande à chaque fois avant qu'il se fige) ou se fige-t-il dès que vous démarrez une session de terminal/fenêtre.

  • À quoi utilisez-vous généralement votre terminal? Si la majorité de votre utilisation concerne uniquement des commandes liées à git, je vous suggère d'utiliser quelque chose comme Github pour Mac car vous pouvez généralement faire la plupart des choses à partir de là.

0 votes

Ctrl-Z et Ctrl-C apparaissent tous deux à l'écran sous la forme de ^Z et ^C, Ctrl-Q ne fait rien. J'ouvre généralement le terminal en utilisant Command-N dans Terminal. Je suis programmeur à temps plein, donc j'utilise le terminal pour tout en gros. Le terminal se bloque avant l'exécution de quoi que ce soit (sur login).

0 votes

@romeovs Que diriez-vous de Pointer 1 concernant votre type d'utilisateur? Une capture d'écran du problème serait également utile. Merci

0 votes

Je suis l'utilisateur par défaut et l'administrateur sur mon macbook.

4voto

Arran McDonald Points 11

Je voudrais essayer de désactiver SIP et la connexion dtrace pour trouver la cause racine (Pour désactiver et réactiver SIP, voir http://osxdaily.com/2015/10/05/disable-rootless-system-integrity-protection-mac-os-x/)

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

En essayant de vous donner un exemple de sortie, je viens de découvrir que les choses sont bien plus simples que je ne le pensais. Pas besoin de désactiver SIP, il suffit de copier login.

dtruss renverra les appels système et cela pourrait donner un indice sur l'endroit où les choses se passent mal.

cp /usr/bin/login .
sudo ls

Entrez votre mot de passe. Ensuite, faites

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

entrez votre nom d'utilisateur, appuyez sur entrée

entrez votre mot de passe, appuyez sur entrée

entrez 'exit', appuyez sur entrée

et enfin téléchargez dtruss_login.txt sur par exemple https://gist.github.com/

Vous pouvez copier le contenu du fichier dans le presse-papiers comme ceci

cat dtruss_login.txt | pbcopy

Vous pouvez trouver un exemple de connexion ici : https://gist.github.com/wolframteetz/49c5188c9dfe68a3841fa18496679579

Le deuxième entier de chaque ligne est le temps que l'appel a pris.

Évidemment, ce serait génial si vous pouviez exécuter ceci lorsque la connexion se bloque, mais si je vous comprends bien, cela est impossible.... peut-être que vous ou quelqu'un d'autre a une idée sur comment 'dtruss login' lorsque le terminal se bloque?

0 votes

Aïe. Cela semble être beaucoup de douleur pour quelque chose qui se produit des heures ou des jours après le début de la connexion. Pouvez-vous préciser ce que dtruss pourrait capturer et afficher?

0 votes

Si la connexion se bloque lors d'un appel système, ce qui est assez probable, il vous le montrera. Si cela se bloque entre les appels système, il vous montrera entre lesquels, et vous donnera un indice sur ce qui se passe réellement. Par exemple, s'il se bloque après avoir lu un certain fichier de configuration par un appel système, l'erreur se produit très probablement pendant l'analyse de cette configuration. Vous devez y jeter un coup d'œil attentif alors. Cela pourrait aussi être lié au réseau... qui sait tant que vous ne le déboguez pas ;)

0 votes

Le problème est que je ne peux pas reproduire manuellement le problème jusqu'à ce qu'il soit trop tard.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X