Дополнение к ответу mivk, в котором я избегаю лажи с новым юнит-файлом (см. мой вопрос здесь Как реагировать на события крышки ноутбука?). Вот мое решение; это не на 100% просто(вздох ), потому что система нестабильна, когда выходит из спящего режима:
На моем компьютере с Fedora 26 я разместил символическую ссылку здесь :/usr/lib/systemd/system-sleep/sleepyhead
, которая указывает здесь :/root/bin/sleepyhead
, которая содержит:
#!/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=$1, \$2=$2"
if [ "$1" = "post" ] ; then
action="RUN trackpoint"
bash /root/bin/trackpoint >/tmp/trackpoint-run 2>&1
else
action="NO ACTION"
fi
logger -t "sleepyhead" "${action}: " "\$1=$1, \$2=$2"
Далее следует сценарий /root/bin/trackpoint
. Обратите внимание, что первый сон имеет решающее значение. Устройство настраивается каждый раз, когда открывается крышка, поэтому сначала оно не существует. Если я попытаюсь сделать что-нибудь, кроме сна, скрипту «сони» потребуется очень много времени для выхода, и мой указатель будет заморожен как минимум на 60 секунд. Кроме того, обратите внимание, что вы не можете поместить скрипт /root/bin/trackpoint
в фоновый режим в sleepyhead
выше. Если вы это сделаете, процесс будет уничтожен при завершении sleepyhead
.
#!/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"
@ibrahim, если у вас есть маршрутизатор с общедоступным IP-адресом, вы можете использовать переадресацию портов на определенный порт на том сервере, который вы настроили.