如何重新加入独立的mosh会话?


157

我如何重新连接到独立的mosh会话,否则将摆脱

Mosh: You have a detached Mosh session on this server (mosh [XXXX]).

即,什么等于

screen -D -R

或可能

screen -wipe

此外,在文档中哪里可以找到此答案?

Answers:


197

出于安全原因,您无法重新连接,请参阅https://github.com/keithw/mosh/issues/394

要终止分离的会话,请使用该消息中显示的PID号(即“ XXXX”部分。)例如,如果看到-

Mosh: You have a detached Mosh session on this server (mosh [12345]).

并可以运行以下命令:

kill 12345

另外,要关闭所有 mosh连接,您可以:

kill `pidof mosh-server`

请注意,如果您当前通过mosh连接,则最后一条命令也会断开您的连接。


34
@artfulrobot因为分离的会话有可能属于仍在某个地方存活的mosh客户端。Mosh会话漫游并且可以通过暂停/恢复(例如,“休眠”)周期生存。mosh无法(也不容易解决)的问题是检测到客户端计算机在没有正常关闭mosh会话的情况下重新启动。
binki 2014年

7
有没有理由不这样做killall mosh-server吗?尤其是因为pidof和killall确实是同一回事。
约旦

6
@Jordan:在某些系统(Solaris中,例如),killall正是它说什么。
暂停,直到另行通知。

4
如果通过mosh连接并且运行killall mosh-server,则将断开连接。
0xcaff

1
@ 0xcaff如果你是连接在狂舞,并运行kill `pidof mosh-server`你会被分离一样的
大卫

26

令我惊讶的是,我使用了CRIU(https://criu.org)来检查点并重新启动Mosh客户端,并且它可以正常工作。

令人震惊

找到您的mosh-client的PID:

$ ps -ef | grep mosh

然后,按照其说明安装CRIU。

然后,像这样检查它:

$ mkdir检查点

$ sudo ./criu dump -D checkpoint -t PID --shell-job

然后,将其还原:

$ sudo ./criu restore -D检查点--shell-job

而且,那里。你的mo客又回来了。

但是要注意的一件事是,如果您的笔记本电脑重新启动(这是我们要保护的重点),那么mosh将使用monotonic时钟来跟踪客户端的时间,这在每次重新启动时都不会起作用。这将不起作用,但是,如果您的笔记本电脑刚刚崩溃,它将无法正常工作,因为mosh序列号将与检查点的版本不同步(二进制文件将恢复,但通信将停止)。

为了解决这个问题,您需要告诉mosh停止这样做并下载mosh源代码。然后,编辑此文件:

cd莫什

vim configure.ac

然后,搜索GETTIME并注释掉该行。

然后做:

如果您是第一次克隆autoreconf#或./autogen.sh

。/配置

使

进行安装

在那之后,您的CRIU检查点的mosh客户端会话将在重启后仍然有效。

(显然,您需要编写一些东西来定期执行检查点,以使其有用。但是,这对读者来说是一个练习)。


1
还原后,请确保键入“ CTRL-L”以刷新屏幕的输出。
Michael Galaxy

6
出于好奇,恢复我所缺少的客户会话是否有实际好处?我在mosh上运行tmux,并且可以在客户端上重新启动mosh并重新连接tmux ...除了这样做很酷之外(这样做确实是真的!)还有其他好处吗?
eskhool 2016年

1
长答案:github.com/mobile-shell/mosh/issues/394简短答案是,是的:如果mosh服务器守护进程已经在目标服务器上运行,则不需要tmux会话。它不仅留下悬挂的悬挂式mosh守护程序,而且还留下了另一组我们不必首先键入的击键。
迈克尔·银河

1
Mosh(在某些情况下)替代SSH,而不是替代屏幕。 答曰keithw在github上(MOSH作者)
törzsmókus

19

我意识到这是一篇过时的文章,但是正如mosh作者Keith Winstein所建议的那样,对此有一个非常简单的解决方案:https : //github.com/mobile-shell/mosh/issues/394

“首先,如果您希望能够从多个客户端连接到会话(或在客户端死亡之后),则应该使用screen或tmux。Mosh(在某些情况下)可以代替SSH,而不是screen。许多Mosh用户将它与屏幕一起使用,并且喜欢这种方式。”

场景:我通过mosh登录到远程服务器。然后,我运行screen并在屏幕会话中运行一个进程,例如htop。我失去了连接(笔记本电脑的电池没电了,失去了网络连接等)。我再次通过mosh连接并在服务器上收到该消息,

Mosh:您在此服务器上有一个独立的Mosh会话(mosh [XXXX])。

我所要做的就是杀死上一次的狂欢

杀死XXXX

重新连接到仍然存在的屏幕会话

屏幕-r

现在,htop(或正在运行的任何进程)将恢复原状,而不会中断,这对于运行升级或其他进程特别有用,如果突然中断,升级或其他进程会使服务器处于混乱的未知状态。我假设您可以使用tmux进行相同的操作,尽管我没有尝试过。我相信这是Annihilannic和eskhool所暗示的。


2
这是一个很好的答案。谢谢,是的,我确认它与tmux相同。
laughing_man

10

作为Varta答案的补充,我使用以下命令关闭除当前连接之外的所有mosh连接:

pgrep mosh-server | grep -v $(ps -o ppid --no-headers $$) | xargs kill


如果没有旧的mosh会话,xkill将抛出错误。更好地利用pgrep mosh-server | grep -v $(ps -o ppid --no-headers $$) && xargs kill || echo "no active sessions to kill"
rubo77

4

正如@varta所指出的那样,出于安全原因,小伙伴们非常反对从不同的客户端重新挂载。因此,如果您的客户端不可用(例如,您重新启动了笔记本电脑),则唯一的选择是终止会话。

要仅终止分离的会话,可以使用以下行(我在其中拥有别名.bashrc)。

who | grep -v 'via mosh' | grep -oP '(?<=mosh \[)(\d+)(?=\])' | xargs kill

该命令取决于以下事实:who列出包括mosh会话在内的已连接用户,只有附加的mosh会话具有“ via mosh”,并且mosh会话的pid放在方括号中。因此,它只为分离的mosh会话找到pid,然后使用xargs将其传递来杀死。

这是示例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)

一种替代方法是使用mosh-server环境变量MOSH_SERVER_SIGNAL_TMOUT。您可以.bashrc服务器端将其设置为300 。然后,如果执行此操作pkill -SIGUSER1 mosh-server,它将仅杀死最近300秒内未连接的mosh服务器(其他服务器将忽略SIGUSER1)。在mosh-server手册页中有更多信息。我使用上面的命令是因为一旦使用别名,对我来说似乎更简单。

请注意,如@Annihilannic所述,如果您在mosh会话中使用tmux / screen,则在杀死mosh会话后,这些tmux / screen会话仍然存在。因此,您仍然可以依附于它们(因此,您自己不会因为杀死Mosh会话而损失太多)。


3

这里声称杀死mosh-server是唯一的选择的答案在很大程度上已经过时了,因为我们可以使用criureptyr恢复和重新附加任意进程。

更不用说如今,我们只能kill -USR1 mosh-server以干净安全的方式杀死独立的会话,而不能求助于不安全的会话。who输出或繁琐的命令来避免杀死我们自己的会话。

criu在Michael R. Hines 的回答旁边,还有一个稍微更多的“轻量级” reptyr,可用于重新附加由其启动的进程mosh-server(即,不是其mosh-server自身)。我通常使用

pstree -p <mosh-server PID>

列出分离的mosh服务器下的进程树,然后

reptyr PID

重新将所需的过程附加到我的当前终端。对我关心的所有过程重复该过程之后,

kill -USR1 <mosh-server PID>

而我只注意杀死我知道属于我(共享系统)的会话。


我得到Unable to attach to pid 10103: Permission denied
rubo77 '19

-1

使用ps命令获取正在运行的任务的列表,或使用 ps -ef | grep mosh

使用以下命令杀死mosh PID:

kill <pid>

另外,要关闭所有mosh连接,您可以:

请注意,如果您当前通过mosh连接,则这也会断开您的连接

kill `pidof mosh-server`
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.