diff options
Diffstat (limited to 'zzz')
-rwxr-xr-x | zzz | 62 |
1 files changed, 62 insertions, 0 deletions
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</sys/power |