SSH接続がオンのときにマシンがスリープしないようにする


13

デスクトップが非アクティブなときに、デスクトップをサスペンドモードに切り替えることで電力を節約しようとしています。しかし、多くのデスクトップも所有者によってSSH経由でアクセスされます。所有者がマシンのスイッチをオンにできるようにwakeonlanソリューションがデプロイされていますが、問題は、SSH接続がオンになっていても、マシンが10分後に再び自動サスペンドすることです。

私がやろうとしていることは、アクティブなSSHセッションを「アクティビティ」定義に含めることです。

問題は、polkitルールを設定することで実現できますか?実際のサスペンドの前に実行するスクリプトを配置して、SSHセッションが見つかった場合に中止することで実行できますか?これを行うための明確で合法的な方法が必要です。そうでない場合は、ハッキーな方法も歓迎します。

現在の素朴なハッキングソリューション:編集/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ますか?
テルドン14

1
より洗練された別のアイデア:[書く場合の呼び出しをドロップできますif who | grep -qv :0; thengrepGNU grepのようなPOSIXに準拠していると仮定)。
デビッドフォースター14

回答:


19

Ubuntu 14.10(Upstartベース)まで

セクション「ファイル」pm-action(8)を見て検索してください/etc/pm/sleep.d。これらのスクリプトのいずれかがゼロ以外の終了ステータスで戻る場合、中断は防止されます。

明確にするために更新された手順:

  1. だからファイルを作成します/etc/pm/sleep.d/05_ssh_keepawake

  2. 入れシェバング#!/bin/sh)と、このファイルに問題に言及したコードを。

  3. 実行許可を設定します。

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

Ubuntu 15.04以降(systemdベース)

systemdpm-utilsを使用して電源状態フックを管理ませんが、同じ目的で独自のインフラストラクチャを持っています。睡眠抑制チェッカーは睡眠時に実行されなくなりましたが、睡眠を抑制するアクションによって設定する必要があります(1を参照)。

そのため、SSHセッションのログインとログアウトにコマンドを追加する必要があります。このコマンドは、睡眠抑制剤をsystemdに登録し(例:経由systemd-inhibit(1))、後で抑制剤をリリースします。SSHログインおよびログアウトにフックする方法を誰かが知っている場合は、関連する手順とコマンドを実行できるようにコメントまたは編集を歓迎します。

次のセクションは進行中の作業です。何をしているのかわかっている場合にのみ使用してください。

オプション/etc/systemd/system/ssh-inhibt-sleep.servicesleep.target使用すること自体を依存させるsystemdユニットを作成できる場合があり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

いつものように、それらを有効にするにはシステム化されたユニットをアクティブにする必要があります:

sudo systemctl enable ssh-inhibt-sleep.service

詳細についてはsystemd.unit(5)、およびを参照してくださいsystemd.service(5)


これは18.04では機能しないようです。これはもはや解決策ではありませんか?
マイケルジャレット

1
@MichaelJarret:確かに。systemdの状況に関する情報で質問を更新しました。
デビッドフォースター

昨日これを整理しようとして次のことがわかりましたが、ここで
マイケルジャレット

私は自分のコメントを編集することはできませんが、また、これは、関連すると思われる
マイケル・ジャレットを

1
@MichaelJarret:別のアイデアがありました。私の答えの更新をご覧ください。
デビッドフォースター
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.