L'accesso al terminale si blocca

21

Ho uno strano problema sul mio nuovo MacBook Pro (late-2016, touch bar).

Funziona bene e quindi, dopo averlo usato per un po ', l'apertura di nuove finestre di Terminale non funziona perché login si blocca. Il riavvio risolve il problema.

Questo sembra essere un problema che altre persone hanno avuto, quindi ho provato già tutte le loro soluzioni (da 1 e [2] ):

  1. Rimozione di ~/Library/Preferences/com.apple.Terminal.plist
  2. Impostazione della shell predefinita su un'altra shell (da /bin/zsh a /bin/sh o /bin/bash )
  3. Rimuovere o pulire il mio .profile , .zprofile , ... Questo non funziona e posso verificare che il problema si verifichi prima che la shell sia invocata, perché if I echo HEY come prima riga del mio .zshenv questo non è nemmeno raggiunto. Deve essere login a causare i problemi. La modifica di /etc/profile per aggiungere un'eco in alto non mostra nulla
  4. Cambiare l'impostazione Run command: nel mio terminale di configurazione con qualcosa come echo foo non funziona (lasciando Run inside shell spuntato o deselezionato non cambia nulla).

Altre note:

  • Come [2] , ssh-add -K non mantiene le chiavi tra i riavvii, cosa con cui non ho mai avuto problemi in precedenza.
  • La console non mostra errori o avvisi sospetti.
  • L'apertura di una nuova finestra Terminal sembra creare un file tty ( /dev/ttys<number> ).
  • In questo caso, non importa se utilizzo Terminal.app o iTerm.app
  • Ho un'installazione abbastanza pulita (ho appena ricevuto il mio laptop, non ho ripristinato alcun backup, ho appena installato alcune app con brew install e brew cask install ).

È molto difficile eseguire il debug perché non riesco a riprodurlo e spesso non riesco ad aprire un nuovo terminale per cercare di scoprire cosa sta succedendo.

Qualcuno ha qualche consiglio?

Aggiornamento:

Usando iTerm, sono riuscito a ottenere una shell impostando il comando start su /bin/bash . In questa shell, tuttavia, sudo non funziona. Si blocca (senza mostrare il prompt) e ctrl-C e ctrl-D non funzionano quando si blocca.

Anche l'utilizzo di alcuni altri programmi non funziona in questa shell: node o /usr/local/bin/node entrambi bloccati. Per quanto ne so, sono i programmi che sono in /usr/local/bin .

Aggiornamento 2:

brew list --full-name risulta in questi pacchetti:

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

Aggiornamento 3:

Questi punti sono in corrispondenza con la risposta di @ Monomeeth:

  1. Quando accade, un elemento login viene mostrato nel monitor dell'attività. (Forza) Chiudendo si chiude anche la finestra del Terminale sospesa. La chiusura manuale della finestra non rende il processo login scomparso nel Monitor attività.

  2. Il titolo del terminale è Terminal — login — term big — ttys001 — 89x18 — ⌘1 , dove term big è il nome delle impostazioni.

  3. Nessun processo sudo visualizzato nel Monitor attività. Posso creare un processo sudo aprendo iTerm.app (che usa bash) ed eseguendo sudo echo ok lì. Non può essere Esci, ma Forza Esce funziona e lo uccide:

    bash-3.2 $ sudo echo ok Ucciso: 9

Aggiornamento 4:

Quando accade, l'esecuzione di login da una shell ancora disponibile funziona, mentre il login nelle shell più recenti sembra bloccarsi.

Aggiornamento 5:

Recentemente ho un nuovo laptop (MacBook Pro 2017, nessuna Touch Bar) e il problema persiste.

Ho cambiato anche le shell: ora sto usando fish con una bella configurazione di vanilla. Penso che escluda il guscio dal colpevole.

Anche il sistema operativo è stato aggiornato a 10.13.3 (17D47) High Sierra.

Ho provato ad installare il meno possibile su questa macchina:

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

Non sei sicuro di cosa possa essere ora. Le uniche app a cui posso pensare sono Divvy o Apptivate poiché entrambe sembrano obsolete. Questa è l'intersezione di ciò che è stato installato sulla vecchia contro la nuova macchina:

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

Aggiornamento 6:

Inoltre, ecco uno screenshot:

Aggiornamento 7:

Il mio ambiente di solito è simile a questo:

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
    
posta romeovs 06.01.2017 - 17:51
fonte

8 risposte

11

Come sono sicuro che tu sappia, la risoluzione dei problemi è un processo di eliminazione e spesso richiede un bel po 'di pazienza. Mi piacerebbe provare un paio di cose per provare e arrivare a fondo per questo per te.

1. Confermare che si blocca durante l'accesso

Se il processo a cui è sospeso è in realtà durante login , ciò implica che il processo è ancora in attesa di creare una sessione di accesso. Supponendo che questo sia il caso, allora non avrebbe ancora provato ad avviare la shell.

Per confermare ciò, la prossima volta che si verifica questo problema, avviare Activity Monitor per verificare se la shell è in esecuzione o se viene visualizzato solo un processo login .

Una volta che hai avuto la possibilità di farlo, riporti ciò che hai trovato.

NOTA: - se ti capita di avere altri terminali aperti, assicurati di controllare la procedura corrispondente. La mia ipotesi è che il processo sospeso sia quello con il numero PID (Process ID) più alto.

2. Qual è il titolo del terminale?

La prossima volta che si presenta questo problema, si può prendere nota di quale sia il titolo della finestra di Terminale e di riferire?

3. Kill sudo

Dichiari che il riavvio del tuo MBP risolve sempre questo problema.

Tuttavia, la prossima volta che avrai questo problema (magari dopo aver fatto quello che ho descritto al punto 1 sopra), vorrei provare a uccidere sudo da Activity Monitor.

Dopo aver provato questo, facci sapere cosa succede.

4. Prova a spostare i file .bash *

È possibile (per vari motivi) avere un file .bash_profile nella directory dell'utente e questo causa problemi intermittenti. È qualcosa di cui forse non sei nemmeno a conoscenza, ma puoi utilizzare Automator per eseguire uno script che trovi e sposta qualsiasi file .bash.

Ecco uno script di esempio per fare questo:

cd ~

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

Questo script sposta tutti i file che iniziano con .bash nella cartella home in una sottocartella spostata appena creata.

Dopo aver eseguito lo script, controlla questa cartella e facci sapere se in effetti ci sono dei file.

NOTA: - puoi etichettare la nuova sottocartella tutto ciò che desideri. Per fare ciò, modifica semplicemente le due occorrenze di spostate nello script con l'etichetta che desideri utilizzare.

[UPDATE]

Altre cose da provare.

5. Prova a cancellare i file * .asl

Se non lo hai già fatto, prova a cancellare i file * .asl. Per fare questo usa il seguente:

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

NOTA: - Questo potrebbe richiedere del tempo poiché crea una nuova shell. Al termine, assicurati di aver chiuso completamente il terminale affinché le modifiche abbiano effetto.

6. Modalità provvisoria

Noti delle differenze di comportamento quando avvii il tuo MBP in modalità provvisoria? Per avviare in modalità provvisoria:

  1. Chiudi completamente il tuo Mac
  2. Riavvia il tuo Mac
  3. Premi immediatamente il tasto Maiusc e tieni premuto
  4. Lascia andare il tasto Maiusc quando vedi la finestra di accesso (NOTA: se hai attivato FileVault potresti dover effettuare il login due volte).
  5. Una volta avviato il tuo MBP, prova a utilizzare Terminal e verifica se riesci a replicare il problema?
  6. Al termine, puoi uscire dalla modalità provvisoria riavviando il tuo MBP come normale

7. Apri Directory

Questo probabilmente non si applica al tuo caso, dal momento che non lo menzioni, ma se sei connesso a una rete Open Directory questo potrebbe anche causare problemi. Di solito ciò comporterebbe solo una attesa di circa 10 - 15 secondi, ma in questa situazione ho visto rapporti di accessi al terminale che richiedono cinque o più minuti.

    
risposta data 18.01.2017 - 07:58
fonte
7

Sembra perfetto per superare i processi massimi per utente (o forse i processi massimi).

Su un'installazione macOS di serie ottieni 709 per utente ( ulimit -u ) e 1064 processi massimi ( sysctl -a | grep maxp )

Un modo semplice per capovolgerli è installare Server.app dall'App Store e quindi riavviare. Puoi anche impostare la modalità Performance per limiti più alti.

Dato che non hai descritto la tua configurazione (versione e build del sistema operativo), ecco alcuni suggerimenti: assicurati di controllare se SIP limiti la possibilità di cambiare file se leggi alcuni dei vecchi articoli sulla modifica dei limiti senza ricorrere a installazione di server.app:

risposta data 24.01.2017 - 05:47
fonte
5

È importante trattare il vero problema e non solo il sintomo. Quindi prova i seguenti suggerimenti e aggiorna in base a quello che può suggerire ulteriori rimedi.

  1. Quale utente possiede il terminale? :
    La mia prima impressione è che questo possa essere correlato alla configurazione del tuo account. Se il terminale sta tentando di accedere alle risorse o alle directory che solo l'utente amministratore può (se il tuo è un account non amministratore), allora questo può portare allo stato di blocco - non ti consente di accedere al terminale. Quindi vai avanti e assicurati quando inizi una sessione di terminale, è locale per il tuo utente e non per un altro utente. Il fatto che non puoi creare un processo sudo, mi sta indirizzando verso questa direzione.

  2. digita Control-Z o Command-Z:
    Questa sequenza di tasti di controllo sospende un programma che potrebbe essere in esecuzione e fornisce un prompt della shell. Ora puoi inserire il comando jobs per trovare il nome del programma, quindi riavviare il programma con fg o terminarlo con kill.

  3. Premi Comando-C :
    Questo si interromperà se il terminale sta tentando di eseguire un programma in background. Provalo un paio di volte. Nota se vedi un output

  4. Tipo Control-Q :
    Se l'output è stato interrotto con Control-S, questo verrà riavviato.

  5. Ottieni una shell alternativa :
    Se vuoi provare una shell diversa per alcuni giorni, i loro comportamenti possono a volte aiutarti a capire il problema con Terminal dato se agiscono in un certo modo. Controlla questi link qui sotto per le alternative

link
link

Aiuterà a conoscere quanto segue, se non già menzionato:

  • Come stai iniziando la sessione del terminale? È tramite riflettori o un'icona sul desktop o in qualche altro modo?

  • Che cosa fa il terminale quando si blocca? È nel mezzo dell'esecuzione di un comando (lo stesso comando ogni volta prima che si blocchi) o si blocca dal momento in cui si avvia una sessione / windows terminale.

  • Di cosa usi solitamente il tuo terminale? Se la maggior parte del tuo utilizzo è solo per i comandi relativi a git, ti suggerirei di utilizzare qualcosa come Github per Mac come di solito puoi fare la maggior parte le cose da lì.

risposta data 22.01.2017 - 09:02
fonte
4

Vorrei provare a disabilitare SIP e dtrace login per trovare la causa principale (Per disabilitare e riattivare SIP, vedere link )

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

Cercando di darti un esempio di output, ho appena scoperto che le cose sono molto più semplici di quanto pensassi. Non è necessario disabilitare SIP, basta copiare il login.

dtuss restituirà le chiamate di sistema e potrebbe dare un indizio su dove le cose vanno male.

cp /usr/bin/login .
sudo ls

indica la tua password. Quindi fai

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

inserisci il tuo nome utente, premi invio

inserisci la tua password, premi invio

inserisci "esci", premi invio

e infine carica dtruss_login.txt ad es. link

Puoi copiare il contenuto del file negli appunti come questo

cat dtruss_login.txt | pbcopy

Puoi trovare un esempio di accesso qui: link

Il secondo numero intero in ciascuna riga corrisponde al tempo richiesto per la chiamata.

Ovviamente, sarebbe bello poterlo eseguire quando il login si blocca, ma se ti capisco bene, questo è impossibile ... forse tu o qualcun altro hai un'idea su come "connettere login" quando il terminale si blocca?

    
risposta data 24.01.2017 - 16:59
fonte
4

Lo vedo da diversi mesi ormai. Estremamente frustrante. L'unica cosa che risolve è il riavvio.

  • Metà 2015 MBP (nessuna barra di tocco)
  • MacOS 10.12.6 beta

A volte l'accesso si blocca dopo un'interazione con tmux.

Ho provato senza successo tutti gli approcci raccomandati.

Non sono sicuro che sia correlato, ma un lsof -p LOGIN_PID mostra un file piuttosto massiccio /private/var/db/dyld/dyld_shared_cache_x86_64h per il processo di accesso bloccato.

Aggiornamento 8/29/2017:

Hai ancora il problema. A volte, quando la macchina si trova in cattive condizioni, ho finestre di terminale aperte che sono già state registrate correttamente e che posso usare per eseguire il debug.

Molti comandi non funzionano correttamente, ma mostrano tutti uno schema di problemi nella scrittura (allo stdout, sto pensando). Ad esempio, quando eseguo ls -al , vedo ls: write error emesso su stderr. Quando eseguo ls -al > /dev/null , non viene stampato nulla su stderr.

    
risposta data 01.06.2017 - 00:18
fonte
1

Il codice sorgente del comando login è stato pubblicato da Apple. Il sito web è sorgente macOS 10.13.3 . L'unico download richiesto è system_cmds-790.30.1 . Una volta scaricato, il progetto può essere facilmente modificato per creare solo il comando login . Il comando modificato e il comando login sono stati inseriti in GitHub all'indirizzo davidanderson61 / system_cmds-10.13.3 .

L'idea qui è di modificare login per scrivere le informazioni di debug sulla console. Ciò aiuterebbe a determinare perché il comando login si blocca. Le modifiche potrebbero essere apportate a chiunque desideri partecipare. Ho pensato che sarei stato io.

Installa Comando debug login .

  1. Seleziona l'ultima versione dal sito web davidanderson61 / system_cmds-10.13.3 / releases .

  2. Scarica il comando debug login nella tua cartella Downloads . In "Risorse", fai clic con il tasto destro su login e seleziona "Scarica file collegato come", quindi seleziona "Salva".

  3. In parte, disabilitare la protezione dell'integrità del sistema (SIP). Il comando è indicato di seguito. Prima di inserire il comando, dovrai avviare un macOS Recover , quindi una finestra di Terminale.

    csrutil  enable  --without  fs
    
  4. Immettere il comando indicato di seguito per salvare il comando login originale. Se login.orignal esiste già, puoi omettere questo passaggio.

    sudo  mv  /usr/bin/login  /usr/bin/login.original
    
  5. Inserisci i comandi indicati di seguito per copiare il comando debug login e imposta le autorizzazioni appropriate.

    sudo  cp  ~/Downloads/login  /usr/bin/login
    sudo  chmod  104555  /usr/bin/login
    
  6. Abilita System Integrity Protection (SIP). Inserisci il seguente comando. Successivamente, dovresti riavviare.

    sudo  csrutil  clear
    

Configura l'applicazione console

Di seguito sono riportati i passaggi per configurare l'applicazione Console in modo che mostri solo i messaggi dal comando login .

  1. Apri l'applicazione Console.
  2. Aggiungi una colonna PID , come mostrato di seguito.

  3. Inserisciloginnelcampodiricerca.

    MentreilcampoCercaèattivo,premereiltastoritorno.Ilcampodiricercadovrebbecambiareaquantomostratodiseguito.

  4. CambiaAnyinProcess,comemostratosotto.

  5. ModificaelencoContainsinEquals,comemostratodiseguito.

  6. SelezionailpulsanteSave.Quandovienerichiesto"Salva ricerca come:", inserisci Login , quindi seleziona Save .

Irisultatidovrebberoapparirecomemostratodiseguito.Laprossimavoltacheapril'applicazioneConsole,dovraisoloselezionareilpulsante"Accedi".

Appendice

CreazionedelrepositoryGitHub.

  1. Faiclicsulfilesystem_cmds.xcodeprojapertoinXcode.
  2. Dallabarradeimenu,selezionaSourceControl->CreateGitRepositories....
  3. Dallabarradeimenu,selezionaProduct->Scheme->NewScheme....Quindi,selezionalogincomeDestinazioneeNome.
  4. Dallabarradeimenu,selezionaProject->Build.
  5. EscidaXcode.
  6. AccediaGitHubecreaunnuovorepository.
  7. NellapartesuperioredellapaginadiinstallazionerapidadelrepositoryGitHub,fareclicsu per copiare l'URL del repository remoto.
  8. Per una finestra dell'applicazione Terminale, immettere il seguente comando. Sostituisci <remote repository URL> con l'URL copiato nel passaggio precedente.

    git  remote  add  origin  <remote repository URL>
    
  9. Apri il progetto in Xcode e dalla barra dei menu, seleziona Source Control->Push... .

Come è stata creata la prima versione

  1. Da una finestra dell'applicazione Terminale, inserisci i seguenti comandi.

    git  tag  -a  v1.0  -m  "Original source code"
    git  push  origin  v1.0
    
  2. Copia il comando login creato nella tua cartella Downloads .

  3. Dal tuo account GitHub, crea un nuovo rilascio come v1.0 . Allega ~/Downloads/login come binario.

risposta data 20.02.2018 - 21:51
fonte
0

Ho avuto questo problema anche mentre eseguivo la console sbt in emacs. Ogni volta che uscivo dalla console sbt semplicemente uccidendo la finestra invece di uscire dalla console sbt "bene" per primo, causava il blocco di un processo java anche dopo la chiusura della finestra e impediva in qualche modo la creazione di nuove sessioni terminali. Ho forzato la rimozione del processo java dal monitor dell'attività e il terminale sospeso è stato effettivamente avviato, sia all'interno di emacs che in una nuova scheda.

Ora, mi limito ad uscire piacevolmente usando il comando exit o ctrl-d (o ctrl-c ctrl-d in emacs term/multi-term ), quindi uccido la finestra.

    
risposta data 08.05.2018 - 05:05
fonte
0
  1. Verifica se il processo si blocca in realtà durante login
  2. Dai un'occhiata al monitor delle attività e fai attenzione ai processi di root (es. nano, emacs, vim) che potresti aver avviato e non chiudere correttamente (crash, solo ucciso il terminale, ecc.) e che sono ancora esecuzione.
  3. Elimina questo / i processo / i e il login dovrebbe funzionare immediatamente.
risposta data 26.09.2018 - 17:07
fonte

Leggi altre domande sui tag