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에 배치하는 이 두 가지 방법의 차이점(있는 경우)이 무엇입니까? 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 커널.
처음에 있는 세 가지 다른 링크 각각에 연결하는 방법이 다양합니다 systemd
. :). 귀하의 스크립트는 /etc
후자 두 개 중 하나에 설치된 일부 프로그램에 의해 실행됩니다. man systemd-sleep
, 및 을 참조하십시오 man systemd.special
. 불행하게도 이러한 후크를 사용하는 정확한 방법은 현재 잘 문서화되어 있지 않습니다. (시스템 레벨에는 특히 약간의 사랑이 필요합니다).
첫 번째 가능한 후크는 다음과 같습니다."억제제"에 로그인이 시스템은 GUI 응용 프로그램에서 사용하도록 만들어졌습니다. 여기에는 DBus 신호 수신이 포함됩니다.