現在ラップトップがスリープ状態になるたびにロックするシステムサービス設定があります/etc/systemd/logind.conf
。
HandleLidSwitch=hibernate
しかし、何らかの理由で私のサービスは実行されません。
これも私のサービスです。
[Unit]
Description=Lock X session using i3lock
Before=hibernate.target
[Service]
User=user
Environment=DISPLAY=:0
ExecStart=/home/user/scripts/locksleep.sh
[Install]
WantedBy=hibernate.target
サービスはsyslogでも呼び出されません。
答え1
systemd-hibernate.service
私はこれが実際にシステムをスリープモードにするサービスになる前にあなたのデバイスを実行する必要があると宣言する必要があると思います。
(私の考えでは、あなたのデバイスが並行して実行されている場合、スクリプトが実行されるsystemd-hibernate.service
前にシステムがスリープモードになる可能性があります。)
したがって、Before=hibernate.target
(不要なもの)に置き換えてください。また、スクリプトの実行が完了するのを待つようにsystemdに指示する必要があるため、そのセクションに追加する必要がありBefore=systemd-hibernate.service
ます。Type=oneshot
[Service]
私はあなたのユニットもアクティブだったと仮定します。これは、hibernate.targetがそれをプルするために必要であるためです...有効にしないと何もトリガーされません。
だから、これはあなたが寝る前にデバイスが正常に動作しない問題を解決するのに十分なようです...
ただし、必要な操作を実行するより適切な方法、つまり休止状態の前に画面をロックする方法があることに注意してください。
正しい方法は阻害剤インターフェース。このメカニズムを説明するページには、このインターフェイスの目的の1つとしてロック画面がリストされています。
画面ロックツールは、一時停止の直前に画面ロックを実行し、一時停止が完了するまで一時停止を延期しようとします。
簡単に言えば、D-Busクライアントを登録し、休止状態になったときに通知を受け取るようにsystemdに割り当ててから、PrepareForSleep()
D-Busの信号を監視して画面をロックすることができます。
理想的には、これはスクリーンセーバー自体で行われる必要があるため、サポートを追加するのが理想的です。
サプレッサインターフェイスが利用できない場合は、サスペンドする前にスクリプトを実行するより簡単な方法は、下にスクリプトを置き、渡された引数を確認してサスペンド前に呼び出されたことを確認する/usr/lib/systemd/system-sleep/
ことです。これにより、サービスデバイスで取得したいのと同じ効果が得られますが、設定がはるかに簡単になります。
よりsystemd-hibernate.service のマニュアルページスクリプトの仕組みのsystem-sleep/
詳細。
答え2
実際、私のラップトップはスワップパーティションがないので休止状態に入ることができないことに気づきました。