버전 1
아래 버전 2로 바로 이동하세요.
데비안에서는 팔로우합니다이 가이드노트북 덮개를 닫을 때의 동작을 정의합니다.
그래서 다음과 같이 수정했습니다.
#!/bin/sh
# Disable sleep on lead (do noting)
echo 'HandleLidSwitch=ignore' | tee --append /etc/systemd/logind.conf
echo 'HandleLidSwitchDocked=ignore' | tee --append /etc/systemd/logind.conf
sudo service systemd-logind restart
# Disable screen on lid close/etc/acpi/events
mkdir -r /etc/acpi/events
echo 'event=button/lid.*' | tee --append /etc/acpi/events/lm_lid
echo 'action=/etc/acpi/lid.sh' | tee --append /etc/acpi/events/lm_lid
# The lid.sh should be in the same directory
mv ./lid.sh /etc/acpi/lid.sh
chmod +x /etc/acpi/lid.sh
# Restarting service to take effect
/etc/init.d/acpid restart
/etc/acpi/lid.sh
그런 다음 기본 동작 대신 뚜껑을 닫을 때마다 활성화되는 동작을 만듭니다 .
lid.sh
이것은 이것 입니다 :
#!/bin/bash
#
# Lid closing event script
grep -q close /proc/acpi/button/lid/*/state
if [ $? = 0 ]; then
echo close>>/tmp/screen.lid
# main user
USER=fauve
# Remaining percent of battry
REMAININGBAT=$(upower -i /org/freedesktop/UPower/devices/battery_BAT0 | grep percentage | sed "s/ *percentage: *\(.*\)%/\1/")
# Test battry remaining percentage
if [ $REMAININGBAT -gt 10 ]; then
# If the percentage is higher than 10
TIMEBEFORELOCK="1m"
TIMEBEFORESUSPENSION="9m"
TIMEBEFORESHUTDOWN="5 minutes"
else
# If the percentage is less than 10
TIMEBEFORELOCK="1m"
TIMEBEFORESUSPENSION="2m"
TIMEBEFORESHUTDOWN="4 minutes"
fi
# Do noting a ${TIMEBEFORELOCK} time
# In case if a quick shifting from a room to another
echo "$(date): Waiting ${TIMEBEFORELOCK} before lock"
sleep ${TIMEBEFORELOCK}
# set screensaver for ${TIMEBEFORESUSPENSION} time
echo "$(date): Lock now"
su -c "DISPLAY=:0.0 /home/$USER/.local/bin/screenlock" - $USER &
echo "$(date): Waiting ${TIMEBEFORESUSPENSION} before suspension"
sleep ${TIMEBEFORESUSPENSION}
# Set a wake up at given time
echo "$(date): Seting time before waking up to ${TIMEBEFORESHUTDOWN}"
echo `date '+%s' -d "+ ${TIMEBEFORESHUTDOWN}"` > /sys/class/rtc/rtc0/wakealarm
# Suspend for ${TIMEBEFORESHUTDOWN} time
echo "$(date): Starting suspention for ${TIMEBEFORESHUTDOWN}"
systemctl suspend
echo "$(date): Wake up"
# Wait 5s to ensure the next command will take effect
sleep 5s
# shutdown
#echo "$(date): Shutdown"
#shutdown +0
fi
grep -q open /proc/acpi/button/lid/*/state
if [ $? = 0 ]; then
echo open>>/tmp/screen.lid
fi
이 스크립트는 덮개를 열지 않는 한 계속 실행됩니다. 그러나 뚜껑이 열리면 중단되어야 합니다(마지막 행에 아직 도달하지 않은 경우).
그렇다면 뚜껑이 열렸을 때 ACPI 인터럽트를 어떻게 만들 수 있을까요?
버전 2
그래서 다음과 같이 스크립트를 업데이트했습니다.
#!/bin/bash
#
# Lid closing event script
PIDFILE=/tmp/lidpid
grep -q close /proc/acpi/button/lid/*/state
if [ $? = 0 ]; then
echo $$ > $PIDFILE
echo "$(date) close">>/tmp/screen.lid
# main user
USER=fauve
# Remaining percent of battry
REMAININGBAT=$(upower -i /org/freedesktop/UPower/devices/battery_BAT0 | grep percentage | sed "s/ *percentage: *\(.*\)%/\1/")
# Test battry remaining percentage
if [ $REMAININGBAT -gt 10 ]; then
# If the percentage is higher than 10
TIMEBEFORELOCK="1m"
TIMEBEFORESUSPENSION="9m"
TIMEBEFORESHUTDOWN="5 minutes"
else
# If the percentage is less than 10
TIMEBEFORELOCK="1m"
TIMEBEFORESUSPENSION="2m"
TIMEBEFORESHUTDOWN="4 minutes"
fi
# Do noting a ${TIMEBEFORELOCK} time
# In case if a quick shifting from a room to another
echo "$(date): Waiting ${TIMEBEFORELOCK} before lock"
sleep ${TIMEBEFORELOCK}
# set screensaver for ${TIMEBEFORESUSPENSION} time
echo "$(date): Lock now"
su -c "DISPLAY=:0.0 /home/$USER/.local/bin/screenlock" - $USER &
echo "$(date): Waiting ${TIMEBEFORESUSPENSION} before suspension"
sleep ${TIMEBEFORESUSPENSION}
# Set a wake up at given time
echo "$(date): Seting time before waking up to ${TIMEBEFORESHUTDOWN}"
echo `date '+%s' -d "+ ${TIMEBEFORESHUTDOWN}"` > /sys/class/rtc/rtc0/wakealarm
# Suspend for ${TIMEBEFORESHUTDOWN} time
echo "$(date): Starting suspention for ${TIMEBEFORESHUTDOWN}"
systemctl suspend
echo "$(date): Wake up"
# Wait 5s to ensure the next command will take effect
sleep 5s
echo "Going to shutdown"
# shutdown
#echo "$(date): Shutdown"
shutdown +0
fi
# Wait 5s to ensure the next command will take effect
sleep 5s
grep -q open /proc/acpi/button/lid/*/state
if [ $? = 0 ]; then
echo "$(date) open">>/tmp/screen.lid
if [ -e $PIDFILE ] ; then
kill -9 $(cat $PIDFILE)
fi
fi
그러나 이제 문제는 ACPI가 덮개가 열려 있는지 감지하는 데 어려움을 겪고 있다는 것입니다. 뚜껑을 닫았다가 열면 /tmp/screen.lid
'닫힘' 표시가 보이지만 '열림' 표시는 보이지 않습니다. "open" 플래그는 나중에 나타나고 무작위로 나타납니다.
답변1
음, 스크립트에 여러 가지 문제가 있습니다.
내가 본 첫 번째 문제는 가이드에서처럼 /proc/acpi/button/lid/*/state에서 덮개 상태를 확인하지 않는다는 것입니다. 열기 및 닫기 작업 시 스크립트가 실행되므로 직접 검사를 추가해야 합니다.
둘째, 덮개가 열릴 때 이미 실행 중인 스크립트 인스턴스를 중지하는 메커니즘이 필요합니다.