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の「電源マネージャー」を介して画面をロックしますが、これをオフにしてみましたが、XFCEの「一時停止」プッシュボタンを使用しても機能します。
次に、ウィジェットを使用しているときとsysファイルシステムを手動で使用しているときにsyslogを比較しようとしましたが、障害や目立つものを示すものは何もありません。
違いはなんですか?
機能に関してはあまり気にしないことに注意してください。コマンドを入力する代わりにプッシュボタンを使用してもまったく問題ありませんが、その理由を理解したいと思います。
TL; DR:systemctl suspend
を使用します。
/sys/power/state
は、XFCEが最終的に呼び出すカーネルAPIです。
カーネルAPIは、フックスクリプト自体を実行しません。ソフトウェアは、一時停止前(および再開後)にコマンドを実行するためにフックインできることを望んでいます。したがって、最も簡単なアプローチは、サスペンドフックを実行し、カーネルを呼び出してから、再開フックを実行するプログラムを用意することです。
これはLinuxであり、そのようなプログラムのいくつかは時間の経過とともに作成されてきました。 systemd
は、現在最も目立つものです。
XFCE、またはsystemctl suspend-> systemd-logind-> systemd-> systemd-sleep-> linuxカーネル。
systemd
:)で始まる3つの異なるリンクのそれぞれで、さまざまな方法でこれにフックすることができます。 /etc
のスクリプトは、後者の2つのうちの1つにインストールされているものによって実行されます。 man systemd-sleep
およびman systemd.special
を参照してください。残念ながら、これらのフックを使用する正確な方法は、現時点では十分に文書化されていません。 (特にsystemdレベルには少しの愛が必要です)。
最初に考えられるフックについては、 logind "inhibitor" システムはGUIアプリでの使用を目的としています。 DBus信号の受信が含まれます。