IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    ssh 会话复用及用户级的 sleep.target

    依云发表于 2016-03-08 23:01:01
    love 0

    本文来自依云's Blog,转载请注明。

    从这里看到 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啦~



沪ICP备19023445号-2号
友情链接