终端登录挂起


21

我的新MacBook Pro(2016年末,触控条)有一个奇怪的问题。

它工作正常然后,使用它一段时间后,打开新的终端窗口不起作用,因为 login 挂起。重新启动可以解决问题。

这似乎是其他人所拥有的一个问题所以我已经尝试了所有的解决方案(来自 1 和 [2] ):

  1. 删除 ~/Library/Preferences/com.apple.Terminal.plist
  2. 将我的默认shell设置为另一个shell(来自 /bin/zsh 至 /bin/sh 要么 /bin/bash )
  3. 删除或清理我的 .profile, .zprofile,...这不起作用,我可以验证问题发生在甚至调用shell之前,因为如果我 echo HEY 作为我的第一行 .zshenv 这甚至都达不到。肯定是 login 造成麻烦。编辑 /etc/profile 在顶部添加回声也没有显示任何内容
  4. 改变了 Run command: 在我的终端配置中设置类似的东西 echo foo 也行不通(离开 Run inside shell 选中或取消选中不会更改任何内容)。

其他说明:

  • 喜欢 [2] , ssh-add -K 在重新启动之间没有坚持密钥,这是我之前从未遇到麻烦的事情。
  • 控制台不会显示任何可疑错误或警告。
  • 开新 Terminal 窗口确实似乎创建了tty文件( /dev/ttys<number> )。
  • 发生这种情况时,如果我使用Terminal.app或iTerm.app并不重要
  • 我有一个非常干净的安装(刚拿到我的笔记本电脑,没有恢复任何备份,只是安装了一些应用程序 brew install 和 brew cask install )。

这真的很难调试,因为我无法重现它,而且我常常无法打开一个新的终端,甚至试图找出正在发生的事情。

有人有任何提示吗?

更新:

使用iTerm,我可以通过将start命令设置为来获取shell /bin/bash。但是,在这个shell中, sudo 不起作用。它挂起(没有显示提示)和 ctrl-C 和 ctrl-D 它挂起时不起作用。

运用 一些 其他程序在这个shell中也不起作用: node 要么 /usr/local/bin/node 都挂了。据我所知,这是程序 /usr/local/bin。

更新2:

brew list --full-name 导致这些包:

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

更新3:

这些观点与@ Monomeeth的答案相符:

  1. 当它发生时,a login 项目确实显示在活动监视器中。 (强制)退出它也会关闭挂起的终端窗口。手动关闭窗口不会使 login 进程在Activity Monitor中消失。

  2. 终端标题是 Terminal — login — term big — ttys001 — 89x18 — ⌘1,哪里 term big 是设置名称。

  3. 没有 sudo 进程显示在活动监视器中。我可以创建一个 sudo 通过打开iTerm.app(使用bash)并运行来完成此过程 sudo echo ok 那里。它不能退出,但强制退出工作并杀死它:

    bash-3.2 $ sudo echo ok 被杀:9

更新4:

当它发生时,运行 login 从一个仍然可用的shell 不 工作,而 login 在较新的贝壳似乎挂起。

更新5:

我最近买了一台新笔记本电脑(MacBook Pro 2017,没有Touch Bar),问题仍然存在。

我也换过贝壳:我现在正在使用 fish 有一个漂亮的香草配置。我认为排除外壳是罪魁祸首。

操作系统也已更新至10.13.3(17D47)High Sierra。

我尝试在这台机器上尽可能少地安装:

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

不知道现在可以做什么。我能想到的唯一应用程序是 Divvy 要么 Apptivate 因为他们似乎都过时了。这是旧机器与新机器上安装的交集:

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

更新6:

另外,这是一个截图: screenshot

更新7:

我的env通常看起来像这样:

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

1
这可能是一个蹩脚的建议,但您是否尝试过联系Apple客户支持?自您发布以来,您的问题没有得到太多关注,他们的支持人员可能已经听说过这个问题。我唯一的其他建议是重新安装MacOS。但是,由于您的Mac是如此新颖,我不知道这是否有效。
— NoahL

@klanomath完成了!
— romeovs

要确定登录的作用,请在“活动监视器”中选择它,然后选择“示例流程”。其他挂起的进程也是如此。但是,此级别的调试可能不适合StackExchange Q&amp; A.向Apple提交错误报告(包括示例文件)或找到能够在此级别提供诊断问题支持的人员可能会更好。看到 developer.apple.com/bug-reporting
— Chris Page

它挂多久了?你试过让它运行十分钟吗?您的计算机是否绑定到Open Directory网络?特别是,登录必须获取您的用户信息,如果您在OD网络上有忙/无响应的目录服务器,则可能需要几分钟的时间来响应;其他程序也会获取用户信息,并可能会遇到此问题。
— Chris Page

没有尝试等待更长时间,下次会尝试。我不受开放目录网络的限制,当我不在任何网络上时,也会发生这些错误。
— romeovs

Answers:


11

我相信你知道,故障排除是一个消除过程,往往需要相当的耐心。我想尝试一些尝试,并为您找到最底层的东西。

1.确认登录时挂起

如果它挂在的过程真的在期间 登录 ,这意味着该进程仍在等待创建登录会话。假设是这种情况,那么它就不会尝试启动shell。

要确认这一点,下次遇到此问题时,请启动Activity Monitor以检查shell是否正在运行,或者您是否只看到了 登录 处理。

一旦你有机会这样做,请回复你发现的内容。

注意:- 如果您碰巧打开了其他终端,请确保您正在检查相应的过程。我的猜测是 挂 process是具有最高进程ID(PID)编号的进程。

2.终端标题是什么?

下次遇到此问题时,您可以记下终端窗口的标题是什么并报告回来吗?

杀死sudo

您声明重新启动MBP始终可以解决此问题。

但是,下次你遇到这个问题时(可能是在我上面的1中所做的那样)之后,我希望你尝试从Activity Monitor中杀死sudo。

一旦你尝试了这个,请告诉我们会发生什么。

4.尝试移动.bash *文件

可能(由于各种原因)您的用户目录中可能包含.bash_profile文件,这会导致间歇性问题。这是您可能甚至不知道的事情,但您可以使用Automator运行查找和移动任何.bash文件的脚本。

以下是执行此操作的示例脚本:

cd ~

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

此脚本将主文件夹中以.bash开头的所有文件移动到新创建的文件中 移动 子文件夹。

运行脚本后,请检查此文件夹,如果实际上您有任何文件,请告诉我们。

注意:- 您可以根据需要为新子文件夹添加标签。为此,只需更改两次出现 移动 在脚本中,您可以使用任何标签。

[UPDATE]

还有一些事要尝试。

5.尝试清除* .asl文件

如果您还没有,请尝试清除* .asl文件。为此,请使用以下内容:

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

注意:- 这可能需要一些时间,因为它会创建一个新的shell。完成后,请确保完全退出终端以使更改生效。

6.安全模式

在安全模式下启动MBP时,您是否注意到行为的任何差异?要启动到安全模式:

  1. 完全关闭你的Mac
  2. 重启你的Mac
  3. 马上按下 转移 关键和 保持下降
  4. 放开吧 转移 当您看到登录窗口时键(注意:如果您启用了FileVault,则可能需要登录两次)。
  5. 一旦你的MBP启动尝试使用终端,看看你是否仍然可以复制该问题?
  6. 完成后,您可以通过正常重新启动MBP退出安全模式

7.打开目录

这可能不适用于您的情况,因为您没有提及它,但如果您连接到Open Directory网络,这也可能导致您出现问题。通常这只需要等待大约10-15秒,但我已经看到终端登录的报告在这种情况下需要五分钟或更长时间才能完成。


谢谢!我正在使用 zsh,甚至空着 .zshrc, .zprofile, .profile,等ID不会发生,加上那不解释为什么其他程序在 /usr/local/bin 也挂了,所以我想 4。 不合适了。一旦得到它们,我会回答其他问题的答案。
— romeovs

添加了包含这些问题答案的更新。 login 似乎是罪魁祸首,但它仍然无法解释为什么它在iTerm中有效 bash。
— romeovs

我已经更新了我的答案。但是,我刚刚意识到您没有说明您等待终端登录完成的时间有多长?最好知道它是否最终登录,或者它是否只是无限期挂起。
— Monomeeth

@romeovs只是想知道,你有没有解决过这个问题?
— Monomeeth

nope :(仍然在努力。但它开始发生的情况要少得多。
— romeovs

7

这似乎非常适合超过每个用户的最大进程(或可能是最大进程)。

在库存macOS安装上,每个用户可获得709( ulimit -u )和1064个最大进程( sysctl -a | grep maxp )

一个简单的方法是从App Store安装Server.app然后重新启动。您还可以将性能模式设置为更高的限制。

由于您没有描述您的设置(操作系统版本和版本),这里有一些提示 - 如果您阅读了一些关于更改限制的旧文章而不诉诸安装服务器,请务必检查SIP是否限制了您更改文件的能力。应用:


优点!我甚至没有考虑过这一点。 :)
— Monomeeth

@Monomeeth你的答案很棒。其中有很多好东西。
— bmike

@bmike有没有办法可以检查进程总数来检查是否是这种情况?也许我甚至可以通过创建709个流程来重现它?
— romeovs

5

处理真正的问题而不仅仅是症状是很重要的。因此,请尝试以下建议并根据更新进行更新,以便进一步提供补救措施。

  1. 哪个用户拥有终端? :
    我的第一个预感是,这可能与您的帐户设置方式有关。如果终端试图访问只有管理员用户可以访问的资源或目录(如果你的是非管理员帐户),那么这可能导致冻结状态 - 不允许你访问终端。因此,请继续并确保在您开始终端会话时,它对您的用户而言是本地的,而不是其他用户。您无法创建sudo进程的事实正在指向我这个方向。

  2. 键入Control-Z 或Command-Z:
    此控制键序列挂起可能正在运行的程序并为您提供shell提示符。现在您可以输入jobs命令来查找程序的名称,然后使用fg重新启动程序或使用kill终止它。

  3. 按Command-C :
    如果终端试图在后台运行程序,这将中断。尝试几次。请注意,如果您看到任何输出

  4. 键入Control-Q :
    如果已使用Control-S停止输出,则会重新启动它。

  5. 获得一个替代shell :
    如果你想尝试不同的shell几天,他们的行为有时可以帮助你理解终端给出的问题,如果他们以某种方式行事。请查看以下链接以获取替代方案

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

如果没有提到,将有助于了解以下内容:

  • 你是如何发起终端会议的? 这是通过聚光灯或桌面图标还是其他方式?

  • 终端在挂机时做什么? 它是在执行命令(每次挂起之前的相同命令)的中间,还是从您启动终端会话/窗口的那一刻起就停止。

  • 您通常使用什么终端? 如果您的大部分用途仅用于git相关命令,我建议使用类似的东西 Github for Mac 因为你通常可以从那里做大部分事情。


Ctrl-Z和Ctrl-C都只显示在屏幕上 ^Z 和 ^C,Ctrl-Q什么都不做。我通常使用Terminal中的Command-N打开shell。我是一名全职程序员,所以我基本上都使用终端。终端在执行任何操作之前挂起(打开 login )。
— romeovs

@romeovs指针1关于你的用户类型是什么?有问题的屏幕截图也会有所帮助。谢谢
— pal4life

我是我的macbook上的默认用户和管理员。
— romeovs

4

我会尝试禁用SIP和dtrace登录以找到根本原因 (要禁用和重新启用SIP,请参阅 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

试图给你一个示例输出,我发现事情比我想象的要简单得多。无需禁用SIP,只需复制登录即可。

dtuss将返回系统调用,它可能会提示出现问题。

cp /usr/bin/login .
sudo ls

提供你的密码。然后做

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

输入您的用户名,按Enter键

输入您的密码,然后按Enter键

输入'exit',按enter键

最后将dtruss_login.txt上传到例如 https://gist.github.com/

您可以像这样将文件的内容复制到剪贴板

cat dtruss_login.txt | pbcopy

您可以在此处找到示例登录: https://gist.github.com/wolframteetz/49c5188c9dfe68a3841fa18496679579

每行中的第二个整数是调用所用的时间。

当然,如果你可以在登录挂起时运行它会很棒,但是如果我说得对,这是不可能的......也许你或其他人知道当终端挂起时如何'登录' ?


哎哟。对于在登录开始后数小时或数天发生的事情,这似乎很痛苦。你能缩小范围吗? dtruss 可能捕获并显示?
— bmike

如果登录在系统调用中挂起,这很可能会显示给您。如果它在系统调用之间挂起,它将显示它们之间,并给你一个关于实际发生的事情的提示。例如如果它在通过系统调用读取某个配置文件后挂起,则最有可能在解析该配置期间发生错误。你需要仔细看看它。也可能与网络有关......谁知道,直到你调试它;)
— user2707001

问题是我不能手动重现问题,直到为时已晚。
— romeovs

然后在“永远”循环中执行命令,并执行“&gt;&gt; dtruss_login.txt 2&gt;&amp; 1”而不是“2&gt; dtruss_login.txt”。一旦出现错误,您将在输出结尾处看到。
— user2707001

我终于得到了一个dtruss日志: gist.github.com/romeovs/6661ae0db77e57281b531676cc5dc007 由于登录挂起,这永远不会退出,所以我在大约10秒后ctrl-C'ed。
— romeovs

4

我已经看了几个月了。非常令人沮丧。只有修复它的东西才是重启。

  • 2015年中期MBP(无触摸条)
  • MacOS 10.12.6 beta

有时登录会在与tmux交互后发生。

我没有尝试过所有推荐的方法。

不确定它是否相关,但是a lsof -p LOGIN_PID 显示一个相当庞大的文件 /private/var/db/dyld/dyld_shared_cache_x86_64h 挂起登录过程。

8/29/2017更新:

还有问题。有时当机器处于坏状态时,我已经打开了已经成功登录的终端窗口,我可以使用它来进行调试。

许多命令运行不正常,但它们都显示出写入困难的模式(对于stdout,我在想)。例如,当我跑 ls -al, 我知道了 ls: write error 发给斯特德尔。我跑的时候 ls -al > /dev/null什么都没有打印到stderr。


搞清楚这有什么好运?
— romeovs

自从更新我的操作系统后,问题就解决了。它已针对一些次要版本修复,我目前正在运行10.13.3(17D47)。
— Zack

我也在运行10.13.3(17D47)!它已经变得频繁,但有时仍然会发生。
— romeovs

1

该 login 命令源代码已由Apple发布。该网站是 macOS 10.13.3来源 。唯一需要的下载是 system_cmds-790.30.1。下载后,可以轻松修改项目以仅构建项目 login 命令。修改后的项目和 login 命令已经放在GitHub中 davidanderson61 / system_cmds-10.13.3 。

这里的想法是修改 login 将调试信息写入控制台。这有助于确定原因 login 命令挂起。任何希望参与的人都可以进行修改。我以为这会是我。

安装调试 login 命令。

  1. 从网站上选择最新版本 davidanderson61 / system_cmds-10.13.3 /释放 。

  2. 下载调试 login 命令你的 Downloads 夹。在“资产”下,右键单击 login 并选择“将链接文件下载为”,然后选择“保存”。

  3. 部分地,禁用系统完整性保护(SIP)。命令如下。在输入命令之前,您需要启动到a macOS恢复 ,然后是终端窗口。

    csrutil  enable  --without  fs
    
  4. 输入下面给出的命令以保存原件 login 命令。如果 login.orignal 已存在,您可以省略此步骤。

    sudo  mv  /usr/bin/login  /usr/bin/login.original
    
  5. 输入下面给出的命令以复制调试 login 命令并设置适当的权限。

    sudo  cp  ~/Downloads/login  /usr/bin/login
    sudo  chmod  104555  /usr/bin/login
    
  6. 启用系统完整性保护(SIP)。输入以下命令。之后,你应该重新启动。

    sudo  csrutil  clear
    

配置控制台应用程序

以下是配置控制台应用程序以仅显示来自的应用程序的步骤 login 命令。

  1. 打开控制台应用程序。
  2. 添加一个 PID 列,如下所示。

    g2

  3. 输入 login 在搜索字段中。

    g3

    搜索字段具有焦点时,按下 返回 键。搜索字段应更改为下面显示的内容。

    g8

  4. 更改 Any 至 Process, 如下所示。

    g4

  5. 列表变更 Contains 至 Equals, 如下所示。

    g5

  6. 选择 Save 按钮。当系统提示“将搜索另存为:”时,请输入 Login,然后选择 Save。

    g6

结果应如下所示。下次打开控制台应用程序时,只需选择“登录”按钮。

g7

附录

如何创建GitHub存储库。

  1. 点击 system_cmds.xcodeproj 文件在Xcode中打开。
  2. 从菜单栏中选择 Source Control->Create Git Repositories...。
  3. 从菜单栏中选择 Product->Scheme->New Scheme...。接下来,选择 login 作为目标和名称。
  4. 从菜单栏中选择 Project->Build。
  5. 退出Xcode。
  6. 登录GitHub并创建一个新的存储库。
  7. 在GitHub存储库的快速设置页面的顶部,单击 g1 复制远程存储库URL。
  8. 对于终端应用程序窗口,请输入以下命令。更换 <remote repository URL> 在上一步中复制了URL。

    git  remote  add  origin  <remote repository URL>
    
  9. 在Xcode中打开项目,然后从菜单栏中选择 Source Control->Push...。

如何创建第一个版本

  1. 在终端应用程序窗口中,输入以下命令。

    git  tag  -a  v1.0  -m  "Original source code"
    git  push  origin  v1.0
    
  2. 复制内置的 login 命令你的 Downloads 夹。

  3. 从您的GitHub帐户,创建一个新版本 v1.0。连接 ~/Downloads/login 作为二进制。


0

我在emacs中运行sbt控制台时也遇到了这个问题。 每当我通过杀死窗口退出sbt控制台而不是首先退出sbt控制台“很好”时,它甚至在窗口关闭后导致java进程挂起,并以某种方式阻止创建新的终端会话。我强制杀死活动监视器中的java进程,并且挂起的终端实际上​​是从emacs内部以及新选项卡中启动的。

现在,我只是确保使用该命令很好地退出 exit 要么 ctrl-d (要么 ctrl-c ctrl-d 在emacs中 term/multi-term ),然后杀死窗口。


0
  1. 检查您的进程是否真的挂起 login
  2. 查看活动监视器并注意 root 您可能已经启动并且没有正确退出的流程(即nano,emacs,vim)(崩溃,只是杀死终端等)以及哪些仍在运行。
  3. 终止此过程,登录应立即生效。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.