![无需 screen 或 tmux 的持久 ssh 会话](https://linux22.com/image/86436/%E6%97%A0%E9%9C%80%20screen%20%E6%88%96%20tmux%20%E7%9A%84%E6%8C%81%E4%B9%85%20ssh%20%E4%BC%9A%E8%AF%9D.png)
我的工作似乎故意破坏了屏幕和 tmux,以便它们在注销时销毁所有会话(当我打开有关它的票时,他们没有回答)。即,当我[分离并]注销时,无论是使用 ctrl-D 还是关闭本地计算机上的终端模拟器,然后重新登录,tmux 和屏幕不再有任何分离的会话。
1)有办法解决这个问题吗?
2)如果系统正在终止注销用户的所有后台进程,我不能指望恢复意外断开的会话,但是是否有工具可以将会话的详细信息写入磁盘?例如emacs中有什么?
我还不知道要提供什么详细信息,所以请询问。
答案1
除了跑步之外emacs -nw
通过ssh
(并保存它是会话),您的选择很少甚至没有,因为很少有工具可以做到这一点(除了 GUI 桌面之外,其尝试执行此操作通常很奇怪)。
由于您的“工作”想要杀死空闲会话,因此它们可能也限制或消除了cron
.
您可以尝试nohup
,但通常也会被签出并杀死。任何有能力的系统管理员都已经预先准备好了可供您使用的解决方法。
答案2
有一个解决方案就是针对这个问题的:莫什!
Mosh 使用 UDP 而不是 TCP,并允许客户端更改 IP 地址并从不同位置或在发生可能中断 TCP 连接的事件后继续会话。它还跟踪服务器上屏幕的内容(类似screen
和tmux
确实),以便服务器可以发送必要的屏幕更新,以便在客户端在断开连接时错过任何更新时使客户端保持最新状态。
Mosh 最初使用 SSH 进行登录并设置会话,但之后,它使用自己的 UDP 协议。
答案3
@Thomas Dickey 和 @Celada 都有很好的建议,经过几天的研究,我有了一个可能感兴趣的不错的解决方案。
第一:当然你应该使用莫什如果服务器端可用。它将允许您处理错误/缓慢的连接。
其次,使用可以将您的工作保存到桌面的编辑器 - 例如,emacs 就有这样的编辑器。根据文档和变量,在 Emacs 24.4 中,当在 init 文件中desktop-auto-save-timeout
使用时,默认情况下它会每 30 秒自动保存一次。(desktop-save-mode 1)
请注意,emacs 可能会锁定桌面文件,因此崩溃后重新启动 emacs 将无法成功执行此操作(desktop-read)
。一些代码来自这里帮助了我(但我不知道它是如何工作的)。将其添加到您的初始化文件中:
;;; desktop-override-stale-locks.el begins here
(defun emacs-process-p (pid)
"If pid is the process ID of an emacs process, return t, else nil.
Also returns nil if pid is nil."
(when pid
(let ((attributes (process-attributes pid)) (cmd))
(dolist (attr attributes)
(if (string= "comm" (car attr))
(setq cmd (cdr attr))))
(if (and cmd (or (string= "emacs" cmd) (string= "emacs.exe" cmd))) t))))
(defadvice desktop-owner (after pry-from-cold-dead-hands activate)
"Don't allow dead emacsen to own the desktop file."
(when (not (emacs-process-p ad-return-value))
(setq ad-return-value nil)))
;;; desktop-override-stale-locks.el ends here
我使用 tmuxtmuxator 客户端这会打开一些窗口/窗格,通过 ssh 连接到我的工作目录服务器端。它并不完美,但htop
使用我最喜欢的 shell 设置带有 和各种打开目录的实例的工作环境仍然相当有效。我的 tmux 配置文件中有一些有用的东西:
# make sure your terminal emulator and tmux are on the same colour scheme, or your nice themes will get screwed up.
set -g default-terminal "xterm-256color"
#if you use vim in tmux you need this for quick ESC key sequences, else it gobbles up ESC key presses.
set -s escape-time 0
# Enable mouse mode (tmux 2.1 and above)
set -g mouse on
# don't rename windows automatically. useful for window "categories"
set-option -g allow-rename off
# switch panes using Alt-arrow without prefix
bind -n M-Left select-pane -L
bind -n M-Right select-pane -R
bind -n M-Up select-pane -U
bind -n M-Down select-pane -D
以及我的 tmuxinator yml 配置文件的片段
windows:
- ouput: # this is the name of a window
layout: tiled
panes: # these are some panes in said window
- cd /some/directory
- cd /another/directory
- cd ~/
- cd ~/
- remoutput:
layout: tiled
panes:
# cd to working dir and start up a zsh session
- ssh me@host -t 'cd ~/working/dir; zsh -i'
# repeat more panes and windows server-side
使用 ssh 断开 tmux 窗口的连接后,将退出到本地 shell,其中上一个命令是 tmux 注释,因此至少可以轻松 up+RET 返回到服务器。您需要避免在您的环境中使用“共享增量历史记录”选项,以确保其有效。
最后,如果您的系统决定终止空闲会话,只需让您的客户端每分钟左右发送一次 SSH Poke,这样他们就不会意识到您处于空闲状态。在 .ssh/config 中执行此操作
Host *
ServerAliveInterval 60
我故意将 emacs 排除在 tmuxinator 配置之外有两个原因。 1 tmux 使用文本编辑器可能会很慢,很难刷新这么多文本,2 我想在服务器模式下运行 emacs,当我在 tmux 中启动时它可能已经在运行了。我通常会运行单独的窗口、客户端和服务器端,专用于在服务器模式下运行的 emacs(当然具有相同的配置)。此外,我设置了 EDITOR="emacsclient -t",以便快速编辑任务将立即连接到 emacs 服务器,无论它们是从哪里调用的。当然,所有这些任务都成为 emacs 桌面的一部分! (如果有人想详细说明如何与其他编辑器一起执行此操作,我很感兴趣。)