Mam dziwny problem z moim nowym MacBookiem Pro (koniec 2016 r., Pasek dotykowy).
Działa dobrze, a następnie, po dłuższym użyciu, otwieranie nowych okien terminala nie działa, ponieważ login
zawiesza się. Ponowne uruchomienie rozwiązuje problem.
Wydaje się, że jest to problem, który mieli inni ludzie, więc wypróbowałem już wszystkie ich rozwiązania (z 1 i [2] ):
- Usuwanie
~/Library/Preferences/com.apple.Terminal.plist
- Ustawianie mojej domyślnej powłoki na inną powłokę (od
/bin/zsh
do/bin/sh
lub/bin/bash
) - Usuwanie lub czyszczenia mój
.profile
,.zprofile
... To nie działa i mogę potwierdzić, że problem występuje, zanim powłoka jest nawet powoływać, bo gdybymecho HEY
jako pierwszej linii mój.zshenv
nie jest jeszcze osiągnięta. To musilogin
powodować problemy. Edycja/etc/profile
dodająca echo u góry również niczego nie pokazuje - Zmiana
Run command:
ustawienia w mojej konfiguracji terminala na coś podobnegoecho foo
również nie działa (pozostawienieRun inside shell
zaznaczonego lub niezaznaczonego niczego nie zmienia).
Inne notatki:
- Podobnie jak [2] ,
ssh-add -K
nie przechowuje kluczy między restartami, z czym nigdy wcześniej nie miałem problemów. - Konsola nie wyświetla żadnych podejrzanych błędów ani ostrzeżeń.
- Otwarcie nowego
Terminal
okna wydaje się tworzyć plik tty (/dev/ttys<number>
). - Gdy to nastąpi, nie ma znaczenia, czy korzystam z Terminal.app lub iTerm.app
- Mam dość czystej instalacji (właśnie dostałem laptopa, nie przywróci żadnych kopii zapasowych, tylko niektóre aplikacje zainstalowane z
brew install
abrew cask install
).
Naprawdę trudno to debugować, ponieważ nie mogę go odtworzyć i często nie mogę otworzyć nowego terminala, aby nawet spróbować dowiedzieć się, co się dzieje.
Czy ktoś ma jakieś wskazówki?
Aktualizacja:
Korzystając z iTerm, byłem w stanie uzyskać powłokę, ustawiając komendę start na /bin/bash
. W tej powłoce jednak sudo
nie działa. Wisi (bez wyświetlania monitu) oraz ctrl-C
i ctrl-D
wykonywać żadnej pracy, gdy wisi.
Używanie niektórych innych programów również nie działa w tej powłoce: node
lub /usr/local/bin/node
oba się zawieszają. O ile mi wiadomo, są to programy /usr/local/bin
.
Aktualizacja 2:
brew list --full-name
wyniki w tych pakietach:
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
Aktualizacja 3:
Te punkty są zgodne z odpowiedzią @ Monomeeth:
Kiedy tak się dzieje,
login
element pojawia się na monitorze aktywności. (Force) Wyjście z niego powoduje także zamknięcie wiszącego okna terminalu. Ręczne zamknięcie okna nie powodujelogin
odejścia procesu w Monitorze aktywności.Tytuł terminala to
Terminal — login — term big — ttys001 — 89x18 — ⌘1
, gdzieterm big
jest nazwa ustawień.W
sudo
monitorze aktywności nie ma żadnego procesu. Mogę utworzyćsudo
proces, otwierając iTerm.app (który używa bash) i uruchamiając gosudo echo ok
. Nie może być Quit, ale Force Quit działa i zabija go:bash-3.2 $ sudo echo ok Zabity: 9
Aktualizacja 4:
Kiedy tak się dzieje, uruchamianie login
z powłoki, która jest nadal dostępna , działa, podczas gdy login
w nowszych powłokach wydaje się, że się zawiesił.
Aktualizacja 5:
Niedawno dostałem nowy laptop (MacBook Pro 2017, bez paska dotykowego) i problem nadal występuje.
Zmieniłem również powłoki: korzystam teraz fish
z dość waniliowej konfiguracji. Myślę, że to wyklucza skorupę jako winowajcę.
System operacyjny został również zaktualizowany do wersji 10.13.3 (17D47) High Sierra.
Próbowałem zainstalować jak najmniej na tym komputerze:
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
Nie jestem pewien, co to może być teraz. Jedyne aplikacje, o których mogę myśleć, to Divvy
lub są Apptivate
one przestarzałe. To jest skrzyżowanie tego, co zostało zainstalowane na starej i nowej maszynie:
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
Aktualizacja 6:
Aktualizacja 7:
Moja env zwykle wygląda następująco:
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
Odpowiedzi:
Jak zapewne wiesz, rozwiązywanie problemów jest procesem eliminacji i często wymaga sporo cierpliwości. Chciałbym spróbować kilku rzeczy, aby dojść do sedna tego problemu.
1. Potwierdź, że zawiesza się podczas logowania
Jeśli proces, na którym się zawiesił, jest naprawdę podczas logowania , oznacza to, że proces nadal czeka na utworzenie sesji logowania. Zakładając, że tak jest, to nie próbowałby jeszcze uruchomić powłoki.
Aby to potwierdzić, następnym razem, gdy wystąpi ten problem, uruchom Monitor aktywności, aby sprawdzić, czy powłoka działa, czy widzisz tylko proces logowania .
Gdy będziesz miał okazję to zrobić, zgłoś to, co znalazłeś.
UWAGA: - Jeśli masz otwarte inne terminale, upewnij się, że sprawdzasz odpowiedni proces. Domyślam się, że proces zawieszania jest tym, który ma najwyższy numer identyfikatora procesu (PID).
2. Jaki jest tytuł terminalu?
Czy następnym razem, gdy pojawi się ten problem, możesz zanotować tytuł okna terminalu i zgłosić go z powrotem?
3. Zabij sudo
Oświadczasz, że ponowne uruchomienie MBP zawsze rozwiązuje ten problem.
Jednak następnym razem, gdy pojawi się ten problem (może po zrobieniu tego, co opisałem w punkcie 1 powyżej), chciałbym, abyś spróbował zabić sudo z Monitora aktywności.
Po wypróbowaniu tego, daj nam znać, co się stanie.
4. Spróbuj przenieść swoje pliki .bash *
Możliwe jest (z różnych powodów), że w katalogu użytkownika może być plik .bash_profile, co powoduje sporadyczne problemy. Jest to coś, czego możesz nawet nie być świadomy, ale możesz użyć Automatora do uruchomienia skryptu, który wyszukuje i przenosi dowolne pliki .bash.
Oto przykładowy skrypt do zrobienia tego:
Ten skrypt przenosi wszystkie pliki zaczynające się od .bash w folderze domowym do nowo utworzonego przeniesionego podfolderu.
Po uruchomieniu skryptu sprawdź ten folder i daj nam znać, czy faktycznie masz w nim jakieś pliki.
UWAGA: - Nowy podfolder można oznaczyć dowolnie. Aby to zrobić, po prostu zmień dwa wystąpienia przeniesienia w skrypcie na dowolną etykietę, której chcesz użyć.
[AKTUALIZACJA]
Jeszcze kilka rzeczy do wypróbowania.
5. Spróbuj wyczyścić pliki * .asl
Jeśli jeszcze tego nie zrobiłeś, spróbuj wyczyścić pliki * .asl. Aby to zrobić, wykonaj następujące czynności:
UWAGA: - Może to zająć trochę czasu, ponieważ tworzy nową powłokę. Po zakończeniu upewnij się, że całkowicie zamknąłeś terminal, aby zmiany odniosły skutek.
6. Tryb awaryjny
Czy zauważasz jakąkolwiek różnicę w zachowaniu, gdy uruchamiasz MBP w trybie awaryjnym? Aby uruchomić w trybie awaryjnym:
7. Otwórz katalog
Prawdopodobnie nie dotyczy to twojego przypadku, ponieważ nie wspominasz o tym, ale jeśli masz połączenie z siecią Open Directory, może to również powodować problemy. Zwykle wiązałoby się to z odczekaniem około 10–15 sekund, ale widziałem doniesienia o tym, że logowanie w terminalu zajmuje w tej sytuacji co najmniej pięć minut.
źródło
zsh
, a nawet z pustym.zshrc
,.zprofile
,.profile
itp id nie występuje, a także, że nie wyjaśnia, dlaczego inne programy/usr/local/bin
również powiesić, więc myślę, 4. jest na zdjęciu. Odpowiem na pozostałe pytania, gdy tylko je otrzymam.login
wydaje się być sprawcą, ale nadal nie wyjaśnia, dlaczego działa w iTermbash
.Wydaje się, że to idealne dopasowanie przekraczające maksymalną liczbę procesów na użytkownika (lub ewentualnie maksymalną liczbę procesów).
W standardowej instalacji macOS otrzymujesz 709 na użytkownika (
ulimit -u
) i maksymalnie 1064 procesów (sysctl -a | grep maxp
)Łatwym sposobem na ich zwiększenie jest zainstalowanie Server.app z App Store, a następnie ponowne uruchomienie. Możesz także ustawić tryb wydajności dla wyższych limitów.
Ponieważ nie opisałeś swojej konfiguracji (wersja i kompilacja systemu operacyjnego), oto kilka wskazówek - koniecznie sprawdź SIP ograniczający możliwość zmiany plików, jeśli czytasz niektóre starsze artykuły na temat zmiany limitów bez konieczności instalowania serwera. aplikacja:
źródło
Widzę to również od kilku miesięcy. Niezwykle frustrujące. Jedyną rzeczą, która to naprawia, jest restart.
Czasami zawiesza się logowanie po interakcji z tmux.
Bezskutecznie wypróbowałem wszystkie zalecane podejścia.
Nie jestem pewien, czy jest to powiązane, ale
lsof -p LOGIN_PID
pokazuje dość masywny plik/private/var/db/dyld/dyld_shared_cache_x86_64h
do zawieszonego procesu logowania.Aktualizacja 29.08.2017:
Nadal mam problem. Czasami, gdy komputer znajduje się w złym stanie, mam otwarte okna terminala, które są już pomyślnie zalogowane i mogę użyć go do debugowania.
Wiele poleceń nie działa poprawnie, ale wszystkie mają problem z pisaniem (myślę, że na standardowe wyjście). Na przykład, kiedy biegam
ls -al
, widzęls: write error
emitowane do stderr. Kiedy biegamls -al > /dev/null
, nic nie jest drukowane do stderr.źródło
Ważne jest, aby traktować prawdziwy problem, a nie tylko objaw. Wypróbuj poniższe sugestie i zaktualizuj je, aby na ich podstawie zasugerować także dalsze środki zaradcze.
Który użytkownik jest właścicielem terminala? :
Moje pierwsze przeczucie polega na tym, że może to mieć związek z konfiguracją konta. Jeśli terminal próbuje uzyskać dostęp do zasobów lub katalogów, które może uzyskać tylko użytkownik admin (jeśli twoje konto nie jest administratorem), może to prowadzić do stanu zawieszenia - uniemożliwiając dostęp do terminala. Więc śmiało i upewnij się, że kiedy zaczynasz sesję terminalową, jest ona lokalna dla twojego użytkownika, a nie innego użytkownika. Fakt, że nie możesz stworzyć procesu sudo, wskazuje mi ten kierunek.
Wpisz Control-Z lub Command-Z:
Ta sekwencja klawiszy sterujących zawiesza uruchomiony program i wyświetla monit powłoki. Teraz możesz wpisać polecenie zadania, aby znaleźć nazwę programu, a następnie ponownie uruchomić program za pomocą fg lub zakończyć go za pomocą kill.
Naciśnij Command-C :
To przerwie, jeśli terminal próbuje uruchomić program w tle. Spróbuj kilka razy. Uwaga, jeśli zobaczysz jakieś dane wyjściowe
Wpisz Control-Q :
Jeśli wyjście zostało zatrzymane za pomocą Control-S, spowoduje to ponowne uruchomienie.
Zdobądź alternatywną powłokę :
jeśli chcesz wypróbować inną powłokę na kilka dni, ich zachowania mogą czasem pomóc ci zrozumieć problem z terminalem, jeśli działają one w określony sposób. Sprawdź poniższe linki, aby znaleźć alternatywy
https://git-scm.com/downloads/guis
https://computers.tutsplus.com/tutorials/beyond-terminal-4-os-x-terminal-alternatives--mac-56217
Pomoże poznać następujące, o ile jeszcze nie wspomniano:
Jak inicjujesz sesję terminalową? Czy dzieje się tak dzięki wyróżnieniu, ikonie na pulpicie czy w inny sposób?
Co robi terminal, gdy się zawiesza? Czy jest w trakcie wykonywania polecenia (to samo polecenie za każdym razem, zanim się zawiesi), czy po prostu zawiesza się od momentu rozpoczęcia sesji terminalu / systemu Windows.
Do czego zwykle używasz swojego terminala? Jeśli większość twoich zastosowań dotyczy tylko poleceń związanych z git, sugerowałbym użycie czegoś takiego jak Github dla komputerów Mac, ponieważ zwykle możesz zrobić większość rzeczy stamtąd.
źródło
^Z
a^C
Ctrl-Q nic nie robi. Zwykle otwieram powłokę za pomocą Command-N w terminalu. Jestem pełnoetatowym programistą, więc używam terminala do wszystkiego. Terminal zawiesza się, zanim cokolwiek zostanie wykonane (włączonelogin
).Chciałbym spróbować wyłączyć logowanie SIP i dtrace, aby znaleźć główną przyczynę (Aby wyłączyć i ponownie włączyć SIP, zobacz http://osxdaily.com/2015/10/05/disable-rootless-system-integrity-protection-mac -os-x / )
Próbując podać przykładowy wynik, właśnie odkryłem, że rzeczy są znacznie prostsze, niż myślałem. Nie trzeba wyłączać SIP, wystarczy skopiować login.
dtuss zwróci wywołania systemowe i może podpowiedzieć, gdzie coś pójdzie nie tak.
podaj swoje hasło Więc zrób
wprowadź swoją nazwę użytkownika, naciśnij enter
wprowadź hasło, naciśnij enter
wpisz „exit”, naciśnij enter
i w końcu przesłać plik dtruss_login.txt na np. https://gist.github.com/
Możesz skopiować zawartość pliku do schowka w ten sposób
Przykładowy login można znaleźć tutaj: https://gist.github.com/wolframteetz/49c5188c9dfe68a3841fa18496679579
Druga liczba całkowita w każdej linii to czas połączenia.
Oczywiście, byłoby wspaniale, gdybyś mógł uruchomić to, gdy logowanie się zawiesza, ale jeśli dobrze zrozumiem, jest to niemożliwe ... może ty lub ktoś inny ma pomysł, jak „dtruss login”, gdy terminal się zawiesza ?
źródło
dtruss
może uchwycić i pokazać?login
Kod źródłowy polecenie zostało opublikowane przez firmę Apple. Witryna jest źródłem macOS 10.13.3 . Wymagane jest tylko pobraniesystem_cmds-790.30.1
. Po pobraniu projekt można łatwo zmodyfikować, aby budował tylkologin
polecenie. Zmodyfikowany projekt ilogin
polecenie zostały umieszczone w GitHub pod adresem davidanderson61 / system_cmds-10.13.3 .Chodzi o to, aby zmodyfikować,
login
aby zapisać informacje debugowania w konsoli. Pomoże to ustalić, dlaczegologin
polecenie się zawiesza. Modyfikacje mogą być wprowadzone przez każdego, kto chce wziąć udział. Zakładałem, że to byłbym ja.Zainstaluj
login
polecenie debugowania .Wybierz najnowszą wersję ze strony davidanderson61 / system_cmds-10.13.3 / releases .
Pobierz
login
polecenie debugowania do swojegoDownloads
folderu. W sekcji „Zasoby” kliknij prawym przyciskiem myszylogin
i wybierz „Pobierz połączony plik jako”, a następnie wybierz „Zapisz”.Częściowo wyłącz ochronę integralności systemu (SIP). Polecenie podano poniżej. Przed wprowadzeniem polecenia należy uruchomić system MacOS Recover , a następnie okno Terminal.
Wpisz polecenie podane poniżej, aby zapisać oryginalne
login
polecenie. Jeślilogin.orignal
już istnieje, możesz pominąć ten krok.Wprowadź polecenia podane poniżej, aby skopiować
login
polecenie debugowania i ustawić odpowiednie uprawnienia.Włącz ochronę integralności systemu (SIP). Wpisz następujące polecenie. Następnie powinieneś zrestartować.
Skonfiguruj aplikację konsoli
Poniżej znajdują się kroki, aby skonfigurować aplikację konsoli tak, aby wyświetlała tylko komunikaty z
login
polecenia.Dodaj
PID
kolumnę, jak pokazano poniżej.Wpisz
login
w polu wyszukiwania.Gdy pole wyszukiwania jest aktywne, naciśnij returnklawisz. Pole wyszukiwania powinno zmienić się na pokazane poniżej.
Zmień
Any
naProcess
, jak pokazano poniżej.Lista Zmień
Contains
naEquals
, jak pokazano poniżej.Wybierz
Save
przycisk. Po wyświetleniu monitu „Zapisz wyszukiwanie jako:” wpiszLogin
, a następnie wybierzSave
.Wyniki powinny wyglądać jak pokazano poniżej. Następnym razem, gdy otworzysz aplikację Console, będziesz musiał jedynie wybrać przycisk „Zaloguj się”.
dodatek
Jak powstało repozytorium GitHub.
system_cmds.xcodeproj
plik otwarty w Xcode.Source Control->Create Git Repositories...
.Product->Scheme->New Scheme...
. Następnie wybierzlogin
jako cel i nazwę.Project->Build
.W oknie aplikacji Terminal wprowadź następujące polecenie. Zamień na
<remote repository URL>
adres URL skopiowany w poprzednim kroku.Otwórz projekt w Xcode i na pasku menu wybierz
Source Control->Push...
.Jak powstało pierwsze wydanie
W oknie aplikacji Terminal wprowadź następujące polecenia.
Skopiuj wbudowane
login
polecenie do swojegoDownloads
folderu.Na swoim koncie GitHub utwórz nową wersję jako
v1.0
. Dołącz~/Downloads/login
jako plik binarny.źródło
Miałem ten problem również podczas uruchamiania konsoli SBT w emacsie. Ilekroć wychodziłem z konsoli sbt, po prostu zabijając okno, zamiast wyjść „ładnie” z konsoli sbt, powodowało to zawieszenie się procesu Java nawet po zamknięciu okna i w jakiś sposób uniemożliwiało utworzenie nowych sesji terminala. Wymusiłem zabicie procesu Java z monitora aktywności, a terminal wiszący faktycznie się rozpoczął, zarówno z poziomu emacsa, jak i nowej karty.
Teraz po prostu upewniam się, że dobrze zamknąłem komendę
exit
lubctrl-d
(lubctrl-c ctrl-d
w emacsieterm/multi-term
), a następnie zabiłem okno.źródło
login
root
procesy (np. Nano, emacs, vim), które mogłeś zainicjować i nie rzucić poprawnie (awaria, właśnie zabiłeś terminal itp.), Które nadal działają.źródło
Tylko moje dwa centy.
Zainstalowałem pakiet Terminus dla Sublime Text, który pozwala mi uruchamiać terminal w moim edytorze tekstu.
Zamknięcie Sublime Text natychmiast pozwoliło mojemu terminalowi znów zacząć działać.
źródło
FWIW, miałem ten sam problem. Rozwiązałoby się to po ponownym uruchomieniu, ale chciałem zaoszczędzić czas na robieniu tego wiele razy dziennie. Zaczęło się po użyciu określonego środowiska nodeJS, więc przeszedłem do monitora aktywności i zauważyłem, że proces węzła jest w toku. Zabicie tego wystąpienia rozwiązało problem dla mnie, więc jeśli ktoś, kto tego doświadczył, niedawno zaczął pracować lokalnie z węzłem lub npm, może to być twój problem.
źródło
Zabicie zabłąkanej instancji nvim naprawiło to dla mnie. Zakładam, że nie jest to specyficzne dla nvim, ale coś, co robił nvim w moim przypadku, powodowało problemy. Szukałbym nieoczekiwanej osieroconej aplikacji terminalu w monitorze aktywności i zabiłbym ją, jeśli ją znajdziesz.
źródło