我如何重新连接到一个独立的mosh会话或以其他方式摆脱
Mosh: You have a detached Mosh session on this server (mosh [XXXX]).
Run Code Online (Sandbox Code Playgroud)
也就是什么是mosh相当于
screen -D -R
Run Code Online (Sandbox Code Playgroud)
或者可能
screen -wipe
Run Code Online (Sandbox Code Playgroud)
此外,在文档中可以找到这个答案的位置?
小智 180
出于安全原因,您无法重新连接,请参阅https://github.com/keithw/mosh/issues/394
要终止分离的会话,请使用该消息中显示的PID编号(即'XXXX'部分.)例如,如果您看到 -
Mosh: You have a detached Mosh session on this server (mosh [12345]).
Run Code Online (Sandbox Code Playgroud)
并且可以运行此命令:
kill 12345
Run Code Online (Sandbox Code Playgroud)
此外,要关闭所有 mosh连接,您可以:
kill `pidof mosh-server`
Run Code Online (Sandbox Code Playgroud)
请注意,如果您当前通过mosh连接,则此最后一个命令也会断开您的连接.
Mic*_*nes 23
令我惊讶的是,我使用CRIU(https://criu.org)检查点并重新启动了一个mosh客户端并且它工作正常.
令人震惊的.
找到你的mosh-client的PID:
$ ps -ef | grep mosh
然后,根据他们的说明安装CRIU.
然后,检查点就像这样:
$ mkdir checkpoint
$ sudo ./criu dump -D checkpoint -t PID --shell-job
然后,恢复它:
$ sudo ./criu restore -D checkpoint --shell-job
而且,就是这样.你的mosh客户回来了.
然而,有一点需要注意的是,如果您的笔记本电脑重新启动(这是我们试图防范的全部内容),则mosh使用monotonic时钟跟踪客户端的时间,这在重新启动时无效.但这不起作用,如果您的笔记本电脑刚刚崩溃,它将无法工作,因为mosh序列号将与检查点的版本不同步(二进制文件将恢复,但通信将停止).
为了解决这个问题,你需要告诉mosh停止这样做并下载mosh源代码.然后,编辑此文件:
cd mosh
vim configure.ac
然后,搜索GETTIME并注释掉该行.
然后做:
autoreconf#或./autogen.sh,如果你刚刚第一次克隆它
./配置
使
make install
之后,您的CRIU-checkpointed mosh客户端会话将在重新启动后继续存在.
(显然你需要写一些东西来定期执行检查点才能有用.但是,这对读者来说是一种练习).
小智 16
我意识到这是一个很老的帖子,但有一个非常简单的解决方案,正如Keith Winstein,mosh作者所建议的那样:https://github.com/mobile-shell/mosh/issues/394
"好吧,首先,如果你想要能够从多个客户端连接到一个会话(或者在客户端死亡之后),你应该使用screen或tmux .Mosh是SSH的替代品(在某些情况下),而不是屏幕.许多Mosh用户将它与屏幕一起使用,就像那样."
场景:我通过mosh登录了远程服务器.然后我运行屏幕并在屏幕会话中运行一个进程,例如htop.我失去连接(笔记本电脑电池死机,丢失网络连接等).我通过mosh再次连接并在服务器上获取该消息,
Mosh:你在这台服务器上有一个独立的Mosh会话(mosh [XXXX]).
我所要做的就是杀死之前的mosh会话
杀XXXX
并重新连接到仍然存在的屏幕会话.
屏幕-r
现在,htop(或正在运行的任何进程)就像没有中断一样回来了.这对于运行升级或其他进程尤其有用,如果突然中断,服务器将处于凌乱的未知状态.我假设你可以用tmux做同样的事情,虽然我没有尝试过.我相信这就是Annihilannic和eskhool的建议.
小智 9
作为Varta答案的补充,我使用以下命令关闭除当前连接之外的所有mosh连接:
pgrep mosh-server | grep -v $(ps -o ppid --no-headers $$) | xargs kill
mosh-server这里声称杀死是唯一选择的答案基本上已经过时了,因为我们可以使用criu和reptyr来恢复和重新附加任意进程。
更不用说现在我们只能kill -USR1 mosh-server以干净、安全的方式杀死分离的会话,而无需诉诸不安全的who输出或繁琐的命令来避免杀死我们自己的会话。
除了criuMichael R. Hines 的答案之外,还有稍微“轻量级”的内容reptyr,可用于重新附加由其启动的进程mosh-server(即不是其mosh-server本身)。我通常使用
pstree -p <mosh-server PID>
Run Code Online (Sandbox Code Playgroud)
列出分离的 mosh-server 下的进程树,然后
reptyr PID
Run Code Online (Sandbox Code Playgroud)
将所需的进程重新附加到我当前的终端。对我关心的所有流程重复该过程后,我
kill -USR1 <mosh-server PID>
Run Code Online (Sandbox Code Playgroud)
而我注意只终止我知道属于我的会话(共享系统)。
正如@varta 指出的那样,出于安全原因,mosh 所有者非常反对从不同客户端重新连接。因此,如果您的客户端不见了(例如,您重新启动了笔记本电脑),您唯一的选择就是终止会话。
要仅终止分离的会话,您可以使用以下行(我在我的 中将其作为别名.bashrc)。
who | grep -v 'via mosh' | grep -oP '(?<=mosh \[)(\d+)(?=\])' | xargs kill
Run Code Online (Sandbox Code Playgroud)
该命令取决于以下事实:who列出连接的用户,包括 mosh 会话,只有附加的 mosh 会话具有“via mosh”,并且 mosh 会话的 pid 位于方括号中。因此,它仅找到分离的 mosh 会话的 pid,并使用 xargs 将它们传递给 kill。
这是一个示例who结果供参考:
$ who
theuser pts/32 2018-01-03 08:39 (17X.XX.248.9 via mosh [193891])
theuser pts/17 2018-01-03 08:31 (17X.XX.248.9 via mosh [187483])
theuser pts/21 2018-01-02 18:52 (mosh [205286])
theuser pts/44 2017-12-21 13:58 (:1001.0)
Run Code Online (Sandbox Code Playgroud)
另一种方法是使用 mosh-server 环境变量MOSH_SERVER_SIGNAL_TMOUT。您可以.bashrc在服务器端将其设置为 300之类的值。然后,如果您执行 apkill -SIGUSER1 mosh-server它只会杀死在过去 300 秒内未连接的 mosh 服务器(其他服务器将忽略 SIGUSER1)。mosh-server 手册页中的更多信息。我正在使用上面的命令,因为一旦别名,它对我来说似乎更简单。
请注意,正如@Annihilannic 所提到的,如果您在 mosh 会话中使用 tmux/screen,那么在您杀死 mosh 会话后,那些 tmux/screen 会话仍然存在。所以你仍然可以附加到它们(所以你真的不会因为杀死 mosh 会话而损失太多)。
| 归档时间: |
|
| 查看次数: |
54272 次 |
| 最近记录: |