Answers:
出于安全原因,您无法重新连接,请参阅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连接,则最后一条命令也会断开您的连接。
killall mosh-server
吗?尤其是因为pidof和killall确实是同一回事。
killall
不正是它说什么。
killall mosh-server
,则将断开连接。
kill `pidof mosh-server`
你会被分离一样的
令我惊讶的是,我使用了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客户端会话将在重启后仍然有效。
(显然,您需要编写一些东西来定期执行检查点,以使其有用。但是,这对读者来说是一个练习)。
我意识到这是一篇过时的文章,但是正如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所暗示的。
正如@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会话而损失太多)。
这里声称杀死mosh-server
是唯一的选择的答案在很大程度上已经过时了,因为我们可以使用criu
并reptyr
恢复和重新附加任意进程。
更不用说如今,我们只能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
使用ps命令获取正在运行的任务的列表,或使用 ps -ef | grep mosh
使用以下命令杀死mosh PID:
kill <pid>
另外,要关闭所有mosh连接,您可以:
请注意,如果您当前通过mosh连接,则这也会断开您的连接
kill `pidof mosh-server`