Ctrl-C 和 SSH 命令

问题描述 投票:0回答:3

我正在尝试创建一个别名以在远程计算机上轻松运行 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)

bash ssh remote-server sigint
3个回答
1
投票

我想通了。当我登录并从生成的 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'

0
投票

按下 CTRL-C 时,本地 ssh 进程(很可能)收到 SIGINT。

您可以尝试更改本地 shell 进程,以不使用

stty
解释 CTRL-C 本身,如下所示:

stty intr ctrl-x

请注意,这将 ctrl-x 重新映射为中断键,因此现在 ctrl-c 在本地被视为普通输入。 这是否有效取决于原始 ctrl-c 的远程处理。


0
投票

打开终端。运行命令 lsof -i : (确保插入您的 端口号)以找出该端口上正在运行的内容。复制 终端输出的进程 ID (PID)。运行命令kill -9 (确保插入您的 PID)以终止端口上的进程。

也许你可以找到它的进程并杀死它而不是控制c

© www.soinside.com 2019 - 2024. All rights reserved.