From edd55f327f0386e403829e379b964c18c39b112b Mon Sep 17 00:00:00 2001 From: Christian Neukirchen Date: Fri, 25 Jul 2014 14:56:00 +0200 Subject: Add zzz, a simple suspend/hibernate script with hooks --- Makefile | 4 +++ zzz | 62 +++++++++++++++++++++++++++++++++++++++++++++ zzz.8 | 88 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 154 insertions(+) create mode 100755 zzz create mode 100644 zzz.8 diff --git a/Makefile b/Makefile index f4e15f7..532622c 100644 --- a/Makefile +++ b/Makefile @@ -12,10 +12,14 @@ install: install -m755 pause ${DESTDIR}/${PREFIX}/bin install -m755 suspend ${DESTDIR}/${PREFIX}/bin install -m755 shutdown.sh ${DESTDIR}/${PREFIX}/bin/shutdown + install -m755 zzz ${DESTDIR}/${PREFIX}/bin + ln -s zzz ${DESTDIR}/${PREFIX}/bin/ZZZ ln -s halt ${DESTDIR}/${PREFIX}/bin/poweroff ln -s halt ${DESTDIR}/${PREFIX}/bin/reboot install -d ${DESTDIR}/${PREFIX}/share/man/man1 install -m644 pause.1 ${DESTDIR}/${PREFIX}/share/man/man1 + install -d ${DESTDIR}/${PREFIX}/share/man/man8 + install -m644 zzz.8 ${DESTDIR}/${PREFIX}/share/man/man8 install -d ${DESTDIR}/etc/sv install -d ${DESTDIR}/etc/runit/runsvdir install -m755 ${SCRIPTS} ${DESTDIR}/etc/runit diff --git a/zzz b/zzz new file mode 100755 index 0000000..ead0051 --- /dev/null +++ b/zzz @@ -0,0 +1,62 @@ +#!/bin/sh +# zzz - really simple suspend script + +USAGE="Usage: ${0##*/} [-nSzZR] + -n dry run (sleep for 5s instead of suspend/hibernate) + -S Low-power idle (ACPI S0) + -z suspend to RAM (ACPI S3) [DEFAULT for zzz(8)] + -Z hibernate to disk & power off (ACPI S4) [DEFAULT for ZZZ(8)] + -R hibernate to disk & reboot" + +fail() { echo ${0##*/}: 1>&2 "$*"; exit 1; } + +export ZZZ_MODE=suspend +export ZZZ_HIBERNATE_MODE=platform + +case "$0" in + *ZZZ) ZZZ_MODE=hibernate;; +esac + +while getopts hnSzRZ: opt; do + case "$opt" in + n) ZZZ_MODE=noop;; + S) ZZZ_MODE=standby;; + z) ZZZ_MODE=suspend;; + Z) ZZZ_MODE=hibernate;; + R) ZZZ_MODE=hibernate; ZZZ_HIBERNATE_MODE=reboot;; + [h?]) fail "$USAGE";; + esac +done +shift $((OPTIND-1)) + +case "$ZZZ_MODE" in + suspend) grep -q mem /sys/power/state || fail "suspend not supported";; + hibernate) grep -q disk /sys/power/state || fail "hibernate not supported";; +esac + +test -w /sys/power/state || fail "sleep permission denied" + +( +flock -n 9 || fail "another instance of zzz is running" + +echo -n "Zzzz... " + +for hook in /etc/zzz.d/suspend/*; do + [ -x "$hook" ] && "$hook" +done + +case "$ZZZ_MODE" in + standby) echo -n freeze >/sys/power/state || fail "standby failed";; + suspend) echo -n mem >/sys/power/state || fail "suspend failed";; + hibernate) + echo $ZZZ_HIBERNATE_MODE >/sys/power/disk + echo -n disk >/sys/power/state || fail "hibernate failed";; + noop) sleep 5;; +esac + +for hook in /etc/zzz.d/resume/*; do + [ -x "$hook" ] && "$hook" +done + +echo "yawn." +) 9