Ubuntu下退出CCL时Shell被终止的问题求助
我之前也碰到过类似的情况,尤其是在老版本Ubuntu和CCL搭配的时候,这其实大多是进程控制或者终端交互层面的小问题,给你几个排查和解决的方向:
检查CCL的启动方式:别用
exec ccl启动!如果不小心用了exec命令,CCL会直接替换当前的Bash进程,而不是作为子进程运行。这样你退出CCL时,原来的Shell进程也跟着没了,自然得重新SSH。正确的做法就是直接输入ccl启动,用pstree -p可以验证——正常情况下CCL应该是Bash的子进程。用rlwrap包装CCL启动:Ubuntu 16.04的终端环境和CCL 1.11.5的终端处理逻辑可能有冲突,导致CCL退出时没有正确恢复终端状态,甚至误触发了Bash的终止。安装
rlwrap工具来包装CCL,既能提升Lisp的交互体验(支持命令历史),也能修复终端相关的问题:- 先安装:
sudo apt-get update && sudo apt-get install rlwrap - 之后用
rlwrap ccl启动CCL,试试退出时Shell会不会保留。
- 先安装:
用子Shell隔离CCL:如果上面的方法不管用,你可以把CCL放到子Shell里运行,这样即使CCL出问题,也不会影响父Shell。启动时直接输入
(ccl),注意括号是必须的——这会创建一个子Shell来运行CCL,退出CCL后子Shell终止,父Shell依然正常运行。检查Bash的信号处理:极端情况下,CCL可能在退出时给父Shell发送了意外的终止信号。你可以在启动CCL前给Bash设置一个陷阱,防止意外退出:
在Bash里输入trap '' SIGHUP,然后再启动CCL。这个命令会让Bash忽略SIGHUP信号,很多时候能解决进程退出连带终止的问题。
如果这些方法都试过还是不行,你可以试试升级CCL到最新版本(1.11.5确实比较老了),或者检查你的Bash配置文件(比如.bashrc、.profile)里有没有奇怪的设置,比如自动退出的脚本逻辑。
内容的提问来源于stack exchange,提问作者jshrager

