ACPI S3で再起動すると(「一時停止」)、実行される(簡単な)カスタムサービスがあり、スクリプトは単にWOL(Wake on LAN)を介してサーバーを起動します。
これはsystemdによって駆動され、スクリプトは/etc/systemd/system/on_resume.serviceにあり、次のように追加されます。
chmod +x on_resume.service
systemctl enable on_resume.service
systemctl status on_resume.service
問題は、XFCEの「一時停止」ウィジェット(メニューの簡単なボタン)を使用してシステムがスリープモードに移行したときにのみスクリプトが実行されることです。
echo "mem" > /sys/power/state を実行すると、システムもスリープ状態になりますが、システムの再起動時にサービスは実行されません。
どちらの場合も、電源ボタンを押して復元しました。
問題は、システムをS3に配置するこの2つの方法の違い(ある場合)は何ですか? XFCE機能を使用するときにsystemdがスクリプトのみを実行するのはなぜですか?
簡単にするために、スクリプトに次のような簡単な内容があるとしましょう。この特定のスクリプトはテスト用であり、まったく同じ問題があるため、問題を再現する最小のバージョンです。
#!/bin/sh
case "$1" in
thaw|resume)
echo "test" > /tmp/testfile_resume
;;
esac
exit 0
システムがスリープモードになったときにXFCEのPower Managerを介して画面をロックしましたが、システムの電源を切ろうとしましたが、XFCEのサスペンドボタンを使用しても機能しました。
その後、ウィジェットを使用してsysファイルシステムを手動で使用してsyslogを比較してみましたが、エラーや注目すべき内容は何もないようです。
違いは何ですか?
私は機能にあまり興味がなく、コマンドを入力する代わりにボタンを使用することもできますが、その理由を知りたいです。
ベストアンサー1
要約:あなたはsystemctl suspend
。
/sys/power/state
XFCEが最終的に呼び出すのはカーネルAPIです。
カーネルAPI自体はフックスクリプトを実行しません。ソフトウェアは、コマンドを実行するために一時停止の前(および再開後)に接続できるようにしたいです。したがって、最も簡単な方法は、プログラムにサスペンドフックを実行し、カーネルを呼び出してから回復フックを実行させることです。
これはLinuxであり、時間の経過とともにこれらのプログラムが複数作成されました。systemd
断然最も目立つものです。
技術的な詳細
XFCE または systemctl がハングする -> systemd-logind -> systemd -> systemd-sleep -> Linux カーネル。
最初の3つの異なるリンクのそれぞれに接続する方法はさまざまですsystemd
。 :).あなたのスクリプトは、後者の/etc
2つのうちの1つにインストールされたいくつかのプログラムによって実行されます。man systemd-sleep
、およびを参照してくださいman systemd.special
。残念ながら、これらのフックを使用する正確な方法は現在よく文書化されていません。 (システムレベルには特に少しの愛が必要です)。
最初の可能なフックは次のとおりです。「抑制剤」にログインこのシステムは、GUIアプリケーションで使用するように作成されています。これにはDBus信号の受信が含まれます。