我正在尝试创建一个别名以在远程计算机上轻松运行 Jupyter。为此,我炮制了这个命令:
ssh -L 5542:localhost:5542 remote \
'cd ipython && .direnv/python-3.8.10/bin/jupyter notebook --no-browser --port 5542'
这工作完美......除了一件事:终端中的 Ctrl-C 似乎没有到达
jupyter-notebook
进程(需要按两次 Ctrl-C 才能彻底关闭)。相反,它似乎停止了 shell 进程并关闭连接,孤立 jupyter-notebook
而不是关闭它。
我尝试编写一个 shell 脚本来包装上面的命令(尽管我真的更喜欢将整个命令作为
ssh
参数传递),甚至尝试捕获 SIGINT
:
#!/bin/bash
cd "$HOME/ipython"
foo() {
echo break
}
trap foo SIGINT
.direnv/python-3.8.10/bin/jupyter notebook --no-browser --port 5542
但是
ssh remote run-jupyter.sh
导致了相同的行为:只是 ^C
,终止连接,孤立 jupyter-notebook
。值得注意的是,没有 break
输出。那么也许 Ctrl-C 会关闭我的 ssh
客户端?
为什么会发生这种情况,如何修复它以便 Ctrl-C 正确传递给
jupyter-notebook
?
(显然,我知道我可以从 Web 客户端菜单关闭 Jupyter,它会正常工作;但这不是重点。)
环境:
localhost
是 Mac OS Ventura 13.2.1,在终端 2.13 (447) 下运行 GNU bash,版本 5.2.15(1)-release (x86_64-apple-darwin22.1.0)
remote
是 Ubuntu 20.04.6 LTS,运行 GNU bash,版本 5.0.17(1)-release (x86_64-pc-linux-gnu)
我想通了。当我登录并从生成的 shell 中调用 Jupyter 时,它就可以工作了;它暗示区别在于进程是否有终端。这让我找到了
-t
的 ssh
选项,即使 ssh
正在执行命令,也强制分配终端。这是按预期工作的最终命令:
ssh -tL 5542:localhost:5542 remote \
'cd ipython && .direnv/python-3.8.10/bin/jupyter notebook --no-browser --port 5542'
按下 CTRL-C 时,本地 ssh 进程(很可能)收到 SIGINT。
您可以尝试更改本地 shell 进程,以不使用
stty
解释 CTRL-C 本身,如下所示:
stty intr ctrl-x
请注意,这将 ctrl-x 重新映射为中断键,因此现在 ctrl-c 在本地被视为普通输入。 这是否有效取决于原始 ctrl-c 的远程处理。
打开终端。运行命令 lsof -i : (确保插入您的 端口号)以找出该端口上正在运行的内容。复制 终端输出的进程 ID (PID)。运行命令kill -9 (确保插入您的 PID)以终止端口上的进程。
也许你可以找到它的进程并杀死它而不是控制c