Acompanhamento da resposta de mivk, na qual eu evito usar um novo arquivo de unidade (veja minha pergunta aqui Como reagir a eventos de tampa do laptop? ). Aqui está minha solução; não é 100% simples ( suspiro ) porque o sistema não está estável quando sai do modo de suspensão:
Na minha caixa do Fedora 26 eu coloco um symlink aqui: /usr/lib/systemd/system-sleep/sleepyhead
que aponta aqui: /root/bin/sleepyhead
, que contém:
#!/bin/sh
## This file (or a link to it) must be in /lib/systemd/system-sleep/
# This is called when the lid is closed, as follows:
# $0=/usr/lib/systemd/system-sleep/sleepyhead, $1=pre, $2=suspend
# ...and when the lid is opened, as follows:
# $0=/usr/lib/systemd/system-sleep/sleepyhead, $1=post, $2=suspend
touch /tmp/sleepyrun
logger -t "sleepyhead" "Start: \=$1, \=$2"
if [ "$1" = "post" ] ; then
action="RUN trackpoint in background"
bash /root/bin/trackpoint >/tmp/trackpoint-run 2>&1
else
action="NO ACTION"
fi
logger -t "sleepyhead" "${action}: " "\=$1, \=$2"
O script /root/bin/trackpoint
segue. Note que o primeiro sono é crítico. O dispositivo é configurado toda vez que a tampa é aberta, portanto, não existe no início. Se eu tentar fazer algo além de dormir, o script "sleepyhead" demora muito para sair e meu ponteiro ficará congelado por pelo menos 60 segundos. Além disso, observe que você não pode colocar o script /root/bin/trackpoint
em segundo plano em sleepyhead
, acima. Se você fizer isso, o processo será eliminado quando sleepyhead
sair.
#!/bin/bash
# This is /root/bin/trackpoint
echo "Start $0"
date
found=false
dir=""
# dirlist can look like:
# /sys/devices/platform/i8042/serio1/serio25/speed
# /sys/devices/platform/i8042/serio1/serio24/speed
# ...the older one appears to get cleaned a little later.
sleep 1 # If I don't put this in here, my pointer locks up for a really long time...
for i in 1 2 3 4; do
speedfiles=$(find /sys/devices/platform/i8042 -name speed) # There may be multiple speed files at this point.
[ -z "$speedfiles" ] && { sleep 1; continue; }
dirlist=$(dirname $speedfiles)
printf "Speed file(s) at $(find /sys/devices/platform/i8042 -name speed | tail -1) \n"
# All this remaking of the path is here because the filenames change with
# every resume, and what's bigger: 9 or 10? ...Depends if you're
# lexicographical or numerical. We need to always be numerical.
largest_number="$(echo $dirlist | tr ' ' '\n' | sed -e 's/.*serio//' | sort -n | tail -1)"
dir="$(echo $dirlist | tr ' ' '\n' | egrep serio${largest_number}\$ )"
echo "Dir is $dir number is $largest_number"
[ -n "$dir" ] && found=true && break
done
$found || exit 1
date
echo -n 4 > $dir/inertia
echo -n 220 > $dir/sensitivity
echo -n 128 > $dir/speed
date
echo "Done $0"