通過 echo ‘mem’ > /sys/power/state 掛起和在 XFCE 中掛起之間的區別?
我有一個(微不足道的)自定義服務,它在從 ACPI S3(“掛起”)恢復時執行,該腳本只是通過 WOL(區域網路喚醒)喚醒伺服器。
這是由 systemd 驅動的,腳本位於 /etc/systemd/system/on_resume.service 並由以下人員添加:
chmod +x on_resume.service systemctl enable on_resume.service systemctl status on_resume.service
問題是該腳本僅在系統通過使用 XFCE 中的“暫停”小元件(菜單中的一個簡單按鈕)進入睡眠狀態時執行。
如果我回顯“mem”> /sys/power/state,系統也會進入睡眠狀態,但當系統重新啟動時服務不會執行。
在這兩種情況下,我只需按下電源按鈕即可將其恢復。
問題是,如果有的話,這兩種將系統放入 S3 的方法有什麼區別?為什麼 systemd 在使用 XFCE 的功能時只執行腳本?
為簡單起見,假設腳本具有以下簡單內容(此特定腳本用於測試,並且存在完全相同的問題,因此它是重現問題的最小版本):
#!/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 掛起 -> systemd-logind -> systemd -> systemd-sleep -> linux 核心。
在開始的三個不同連結中的每一個中,都可以以不同的方式掛鉤這一點
systemd
:)。您的腳本/etc
由安裝在後兩者之一中的東西執行。見man systemd-sleep
和man systemd.special
。不幸的是,您使用這些鉤子的確切方式現在沒有很好的記錄。(特別是 systemd 級別需要一點愛)。至於第一個可能的鉤子:登錄的“抑製劑”系統旨在供 GUI 應用程序使用。它涉及接收 DBus 信號。