SSH远程Ubuntu机器按住按键时IPython崩溃问题求助
问题:SSH远程连接下IPython长按按键崩溃,提示无法创建新线程
问题现象
- 通过SSH连接到Ubuntu 18.04.2 LTS机器,启动IPython会话后,只要长按按键(比如退格键)约半秒,IPython就会直接崩溃
- 崩溃后进入异常bash环境:按键输入无法显示,但能正常执行
ls、man、pwd、ipython等命令,只能通过先按Ctrl+D再按Ctrl+C来终止会话,根本没法执行%tb这类调试命令
崩溃时的错误堆栈
File "/home/zach/local/anaconda3/bin/ipython", line 11, in <module> sys.exit(start_ipython()) File "/home/zach/local/anaconda3/lib/python3.7/site-packages/IPython/__init__.py", line 125, in start_ipython return launch_new_instance(argv=argv, **kwargs) File "/home/zach/local/anaconda3/lib/python3.7/site-packages/traitlets/config/application.py", line 658, in launch_instance app.start() File "/home/zach/local/anaconda3/lib/python3.7/site-packages/IPython/terminal/ipapp.py", line 356, in start self.shell.mainloop() File "/home/zach/local/anaconda3/lib/python3.7/site-packages/IPython/terminal/interactiveshell.py", line 498, in mainloop self.interact() File "/home/zach/local/anaconda3/lib/python3.7/site-packages/IPython/terminal/interactiveshell.py", line 481, in interact code = self.prompt_for_code() File "/home/zach/local/anaconda3/lib/python3.7/site-packages/IPython/terminal/interactiveshell.py", line 410, in prompt_for_code **self._extra_prompt_options()) File "/home/zach/local/anaconda3/lib/python3.7/site-packages/prompt_toolkit/shortcuts/prompt.py", line 738, in prompt return run_sync() File "/home/zach/local/anaconda3/lib/python3.7/site-packages/prompt_toolkit/shortcuts/prompt.py", line 727, in run_sync return self.app.run(inputhook=self.inputhook, pre_run=pre_run2) File "/home/zach/local/anaconda3/lib/python3.7/site-packages/prompt_toolkit/application/application.py", line 709, in run return run() File "/home/zach/local/anaconda3/lib/python3.7/site-packages/prompt_toolkit/application/application.py", line 682, in run run_until_complete(f, inputhook=inputhook) File "/home/zach/local/anaconda3/lib/python3.7/site-packages/prompt_toolkit/eventloop/defaults.py", line 123, in run_until_complete return get_event_loop().run_until_complete(future, inputhook=inputhook) File "/home/zach/local/anaconda3/lib/python3.7/site-packages/prompt_toolkit/eventloop/posix.py", line 66, in run_until_complete self._run_once(inputhook) File "/home/zach/local/anaconda3/lib/python3.7/site-packages/prompt_toolkit/eventloop/posix.py", line 85, in _run_once self._inputhook_context.call_inputhook(ready, inputhook) File "/home/zach/local/anaconda3/lib/python3.7/site-packages/prompt_toolkit/eventloop/inputhook.py", line 78, in call_inputhook threading.Thread(target=thread).start() File "/home/zach/local/anaconda3/lib/python3.7/threading.py", line 847, in start _start_new_thread(self._bootstrap, ()) RuntimeError: can't start new thread
已排查的情况
- 不是Python本身的问题:直接启动Python交互环境,长按按键完全正常
- 换IPython版本/安装源没用:不管用Anaconda自带的IPython,还是系统的
/usr/bin/ipython,问题都存在;重装Anaconda也解决不了,但同版本Ubuntu的另一台全新安装Anaconda的机器完全没这个问题 - 初步怀疑:从报错看是线程创建耗尽,推测IPython的事件循环可能给每个按键事件都创建新线程,长按按键时短时间生成大量线程,超出系统限制;这个问题和IPython文档里提到的OS X下按方向键崩溃的情况很类似
- 确认过没有其他程序占用大量线程
解决思路
我给你几个可以尝试的方案,按顺序试就行:
- 禁用IPython的inputhook:启动IPython时加上
--no-inputhook参数,也就是执行ipython --no-inputhook,这个参数可以禁用prompt_toolkit的输入钩子,避免它创建过多线程 - 调整终端环境变量:试试修改TERM变量,比如先执行
export TERM=xterm-256color,再启动IPython;有些时候SSH连接的终端类型不兼容会导致按键事件处理异常 - 调整prompt_toolkit版本:报错出在prompt_toolkit的线程创建部分,你可以试试安装和IPython 7.5.0兼容的旧版本prompt_toolkit,比如执行
pip install prompt_toolkit==2.0.10,或者升级到最新的兼容版本 - 检查系统线程限制:执行
ulimit -u查看当前用户的最大进程/线程数,如果数值比较低(比如1024),可以临时调高试试:ulimit -u 4096,再启动IPython测试 - 收集信息提交bug:如果上面的方法都没用,你可以启动IPython时加上
--Application.verbose_crash=True参数,获取更详细的崩溃日志,然后提交给IPython的官方团队
内容的提问来源于stack exchange,提问作者Zach Boyd
相关产品推荐
相关产品推荐

