Skip to content

Commit

Permalink
add zzz suspend/hibernate utility
Browse files Browse the repository at this point in the history
taken from https://github.com/voidlinux/void-runit which is under the
following license:
void-runit is in the public domain.

To the extent possible under law, the creator of this work has waived
all copyright and related or neighboring rights to this work.

http://creativecommons.org/publicdomain/zero/1.0/
  • Loading branch information
rofl0r committed Jul 26, 2016
1 parent b2fbf04 commit bc696f8
Show file tree
Hide file tree
Showing 2 changed files with 158 additions and 0 deletions.
64 changes: 64 additions & 0 deletions KEEP/bin/zzz
@@ -0,0 +1,64 @@
#!/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
-H hibernate to disk & suspend (aka suspend-hybrid)"

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 hnSzHRZ: 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) ZZZ_MODE=hibernate; ZZZ_HIBERNATE_MODE=suspend;;
[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"

printf "Zzzz... "

for hook in /etc/zzz.d/suspend/*; do
[ -x "$hook" ] && "$hook"
done

case "$ZZZ_MODE" in
standby) printf freeze >/sys/power/state || fail "standby failed";;
suspend) printf mem >/sys/power/state || fail "suspend failed";;
hibernate)
echo $ZZZ_HIBERNATE_MODE >/sys/power/disk
printf 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
94 changes: 94 additions & 0 deletions KEEP/share/man/man8/zzz.8
@@ -0,0 +1,94 @@
.Dd July 25, 2014
.Dt ZZZ 8
.Os Linux
.Sh NAME
.Nm zzz ,
.Nm ZZZ
.Nd suspend or hibernate your computer
.Sh SYNOPSIS
.Nm zzz
.Op Fl nSzZRH
.Nm ZZZ
.Op Fl nSzZRH
.Sh DESCRIPTION
.Nm
is a simple script to suspend or hibernate your computer.
It supports hooks before and after suspending.
.Bl -tag -width indent
.It Fl n
dry-run mode.
Instead of performing an ACPI action,
.Nm
will just sleep for a few seconds.
.It Fl S
Enter low-power idle mode (ACPI S0, kernel name "freeze").
.It Fl z
Enter suspend to RAM mode (ACPI S3, kernel name "mem").
This is the default for
.Nm zzz .
.It Fl Z
Enter hibernate to disk mode (ACPI S4, kernel name "disk") and power off.
This is the default for
.Nm ZZZ .
.It Fl R
Enter hibernate to disk mode and reboot.
This can be used to switch operating systems.
.It Fl H
Enter hibernate to disk mode and suspend.
This is also know as suspend-hybrid.
.El
.Sh FILES
Before suspending,
.Nm zzz
runs the executable files in
.Pa /etc/zzz.d/suspend
in alphanumeric order.
After suspending,
.Nm zzz
runs the executable files in
.Pa /etc/zzz.d/resume
in alphanumeric order (not in reverse order!).
.Pp
The environment variable
.Ev ZZZ_MODE
can be used in these hooks to differentiate between
.Ic standby ,
.Ic suspend ,
and
.Ic resume .
.Sh DIAGNOSTICS
.Bl -tag -width indent
.It suspend/hibernate not supported
The hardware does not support ACPI S3/S4 with this kernel.
.It sleep permission denied
You lack sufficent privilege to write to
.Pa /sys/power/state .
.It another instance of zzz is running
.Nm
locks
.Pa /sys/power
during operation.
Perhaps a hook is stuck?
.It Zzzz... yawn.
The system has woken up again.
Everything is fine.
You feel refreshed.
.Sh SEE ALSO
.Xr pm-action 8 ,
.Xr s2disk 8 ,
.Xr s2ram 8 ,
OpenBSD's
.Xr apm 8
.Sh HISTORY
A similar
.Nm apm
command appeared in
.Nx 1.3
and
.Ox 1.2 .
.Sh AUTHOR
.An Christian Neukirchen ,
.Mt chneukirchen@gmail.com .
.Sh LICENSE
.Nm
is in the public domain.

0 comments on commit bc696f8

Please sign in to comment.