开启SSH连接时防止机器进入休眠状态


13

我试图通过在桌面不活动时将其切换到挂起模式来节省电量。但是,许多桌面也可以由其所有者通过SSH访问。已部署了一个waokelan解决方案,以使所有者能够打开计算机,但是问题是,即使SSH连接已打开,计算机也将在10分钟内再次自动挂起。

我想要做的是在“活动”定义中包括活动的SSH会话。

问题是可以通过设置polkit规则来完成吗?是否可以通过放置一个在实际挂起之前运行的脚本来完成,如果找到SSH会话,则将其中止?我需要一个干净的合法方法。如果不是那样,那么也欢迎采用骇人听闻的方式。

当前的朴素hacky解决方案:编辑/usr/sbin/pm-suspend

#check for SSH sessions, and prevent suspending:
if [ "$(who | grep -cv "(:")" -gt 0 ]; then
    echo "SSH session(s) are on. Not suspending."
    exit 1
fi

这达到了目的。但是我不知道更新什么时候会覆盖文件/usr/sbin/pm-suspend。我也不知道这如何与tuxonice之类的其他挂起实现一起工作。


2
我可以建议使用grep -cv :0而不是通过wc吗?
terdon 2014年

1
另一个使人更优雅的想法:[如果编写,则可以放弃if who | grep -qv :0; then对它的调用(假设您具有符合grepGNU grep 的POSIX规范)。
David Foerster 2014年

Answers:


19

直到Ubuntu 14.10(基于Upstart)

在“文件”部分中进行查找pm-action(8)和搜索/etc/pm/sleep.d。如果这些脚本之一以非零退出状态返回,则可以防止挂起。

更新了说明以使内容更清晰:

  1. 因此,创建一个文件/etc/pm/sleep.d/05_ssh_keepawake

  2. 在该文件中放入shebang#!/bin/sh)和问题中提到的代码。

  3. 对其设置执行权限:

    chmod +x /etc/pm/sleep.d/05_ssh_keepawake
    

从Ubuntu 15.04开始(基于系统)

systemd不使用pm-utils来管理其电源状态挂钩,但在同一端具有自己的基础结构。睡眠抑制检查器不再在睡眠时执行,而必须通过抑制睡眠的动作进行设置(请参阅1)。

这样,您必须向SSH会话登录和注销添加命令,以在systemd中注册一个睡眠抑制器(例如通过systemd-inhibit(1)),然后释放该抑制器。如果有人知道如何进行SSH登录和注销,欢迎您发表评论或进行编辑,以便我们制定相关的步骤和命令。

以下部分正在进行中-仅在知道自己在做什么时才使用它!

您也许可以编写一个systemd单元/etc/systemd/system/ssh-inhibt-sleep.service,使其本身成为sleep.target使用该RequiredBy选项的依赖项。如果您的新设备发生故障(被调用的进程的退出状态为非零退出),它将执行sleep.target并随后进行睡眠操作。

[Unit]
Description=Check for running SSH sessions and, if any, inhibit sleep
Before=sleep.target

[Service]
Type=oneshot
ExecStart=/bin/sh -c '! who | grep -qv :0'`

[Install]
RequiredBy=sleep.target

与往常一样,您需要激活systemd单元才能使其生效:

sudo systemctl enable ssh-inhibt-sleep.service

有关更多信息,请参见systemd.unit(5)systemd.service(5)


这似乎在18.04中不起作用。这不再是解决方案吗?
Michael Jarret

1
@MichaelJarret:的确如此。我用有关systemd情况的一些信息更新了我的问题。
大卫·佛斯特

我发现,试图了这一点昨天整理如下,但不能修改前面的脚本来完成这项工作在这里
迈克尔·贾勒特

我不能编辑我的意见,但也似乎有关
迈克尔·贾勒特

1
@MichaelJarret:我有另一个想法可以尝试。查看我的答案的更新。
大卫·佛斯特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.