书接上文,docker pause/unpause 不是特别稳定,解冻之后频繁出现无法连接 Sunshine 的问题。受 Nyrna 项目 启发换用了 SIGSTOP 和 SIGCONT 信号机制,但与 Nyrna 区别在于我会先寻找 Steam 主进程,遍历所有子进程然再执行批量暂停,恢复也是类似。
实际效果相当满意,基本保留了 docker pause/unpause 的所有优点,同时非常稳定,暂停和恢复能做到一秒级别。演示如下:
缺点还是有的,因为没有暂停整个容器,系统时钟还在运行,有些游戏(比如 P3R)存档时间还是基于系统时钟计算,会导致内部存档时间依旧把暂停时间算在内。不是所有游戏都会受影响,FF7RB 则不会。理论上可以使用 libfaketime 解决,但我能接受这个缺点,懒得折腾了。
完整脚本见 Gist。
另一种比较舒服的方式是加到 Sunshine Application(一般是桌面应用)的启动/关闭脚本中,断开 Sunshine 连接能自动冻结 Steam 和游戏进程,连接则自动恢复进程,同时加了额外检测,如果只有 Steam 本体运行没有运行游戏,则不会暂停,方便后台下载游戏的场景。此外会写日志到脚本同目录下方便调试和观察是否触发脚本。