从这里看到 ssh 的 Control master 特性之后,就在~/.ssh/config
里启用了这个特性:
ControlPath ~/.ssh/master-%r@%h:%p ControlMaster auto ControlPersist yes Compression yes
会话连接复用,对于以交互操作的使用,很不错的!对低延迟的服务器可能只是少了用户认证过程,但对于连接国外服务器,少了 TCP 握手、SSH 握手与认证等来来回回的过程,连接会快非常多的,尤其是对于常用的服务器,比如 GitHub 之类的,提速非常明显。
然后,问题就来了:系统挂起再恢复之后,大部分连接会 stalled,需要手工断开连接。即使配置了超时,它也不一定及时。于是我想,既然 netctl-auto 之类的服务能够在挂起系统时适当处理,那么我是不是也能写一个用户级的 systemd 服务来处理这件事情呢?
于是我按系统级的配置方法弄好了,结果什么也没有发生……后来才明白,只有系统级的 sleep.target,没有用户级的啊。
在 Arch Linux 官方论坛看到有人这么尝试,让系统级的 systemd 调用用户级的 systemd。配置有点不对,但是想法是非常好的!
于是就有了我现在用的方案:
[Unit] Description=sleep.target of a systemd user session Before=sleep.target StopWhenUnneeded=yes [Service] Type=oneshot User=%I Environment=DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/%I/bus RemainAfterExit=yes ExecStart=/usr/bin/systemctl --user start sleep.target ExecStop=/usr/bin/systemctl --user stop sleep.target [Install] WantedBy=sleep.target
启用(enable)user-sleep@1000.service
之后,系统挂起时,就会调用 ID 为 1000 的用户的用户级 systemd,也 reach sleep.target 啦。当然这个用户级的 sleep.target 也得自己写:
[Unit] Description=Sleep Documentation=man:systemd.special(7) DefaultDependencies=no StopWhenUnneeded=yes
然后就可以让用户级的服务WantedBy=sleep.target
啦~