Правильный способ выполнения скрипта при возобновлении работы из приостановки
Убунту 20.04
Я провел несколько поисков способов выполнения скрипта или команды при возобновлении работы из режима ожидания и придумал несколько различных способов сделать это, например описанный здесь, но ни один из них не сработал для меня.
Первый способ, который я нашел, это использование pm-utils. По-видимому, этот метод был удален из Ubuntu начиная с 15.04 или около того.
Следующее, что я нашел, это использовать systemd/system-sleep — это тоже не сработало для меня. Я попытался создать скрипт в каталоге /usr/lib/systemd/system-sleep, также попробовал каталог /lib/systemd/system-sleep (который, по-видимому, связан с /usr/lib/systemd/system-sleep, поскольку изменения в одно появляется в другом). Я также попытался изменить уже существующий скрипт под названием hdparm - это также не сработало (мотивация, которую я сделал, была
Итак, может ли кто-нибудь сказать мне, как правильно запустить скрипт или команду при возобновлении работы?
Спасибо за любой вклад/предложения/веб-сайты - особенно с подробными инструкциями и объяснениями того, что происходит на этом пути...
Редактировать:
Основываясь на ответе Матиго, я сделал следующее:
В /etc/pm/sleep.d я создал скрипт с именем 00xmodkey.sh. Я добавил в этот файл следующий код скрипта, затем убедился, что он принадлежит пользователю root и имеет права на выполнение.
Содержимое скрипта (в качестве оболочки пробовали и sh, и bash):
#!/bin/sh
case "${1}" in
resume|thaw)
touch /tmp/xmodlog.log
echo "$(date) - lib testing" >> /tmp/xmodlog.log
;;
esac
Подтвержденные права собственности и разрешения:
ls -l 00xmodkey.sh
-rwxr-xr-x 1 root root 257 Feb 4 22:49 00xmodkey.sh
Затем я перевел систему в режим ожидания. Ждал `~ 20 секунд. Разбудил систему. Поискал в /tmp файл с именем xmodlog.log. Нет файла.
Значит, я все еще что-то упускаю...
Редактировать 2:
Основываясь на ответе blitzter47, я разместил скрипт в
#!/bin/sh
# Remap a key to allow context menu access
case "$1" in
post)
echo "$(date) - lib testing" >> /tmp/xmodlog.log
;;
*)
echo "$(date) - $(1) $(2) - lib testing" >> /tmp/xmodlog.log
;;
esac
exit 0
Файл xmodlog.log никогда не отображается в /tmp, поэтому либо что-то не так со скриптом, либо скрипт никогда не выполняется.
Редактировать 3:
Основываясь на комментариях ниже, я изменил сценарий, чтобы явно указать путь к командам, и использовал
#!/bin/sh
# Remap a key to allow context menu access
case "$1" in
post)
/bin/touch /home/tracy/xmodlog.log
;;
*)
/bin/touch /home/tracy/xmodlog.log
;;
esac
exit 0
Таким образом, даже со всем, что указано явно, и с использованием папки, к которой, как я знаю, есть доступ у моего пользователя (система должна иметь доступ ко всему, если она работает в системном контексте), она все равно не работает.
Редактировать 4:
Запрошенный вывод из «sudo systemctl status sleep.target suspend.target hibernate.target hybrid-sleep.target»:
tracy@tracy-HP17:~$ sudo systemctl status sleep.target suspend.target hibernate.target hybrid-sleep.target
● sleep.target - Sleep
Loaded: loaded (/lib/systemd/system/sleep.target; static; vendor preset: e>
Active: inactive (dead)
Docs: man:systemd.special(7)
● suspend.target - Suspend
Loaded: loaded (/lib/systemd/system/suspend.target; static; vendor preset:>
Active: inactive (dead)
Docs: man:systemd.special(7)
● hibernate.target - Hibernate
Loaded: loaded (/lib/systemd/system/hibernate.target; static; vendor prese>
Active: inactive (dead)
Docs: man:systemd.special(7)
● hybrid-sleep.target - Hybrid Suspend+Hibernate
Loaded: loaded (/lib/systemd/system/hybrid-sleep.target; static; vendor pr>
Active: inactive (dead)
Docs: man:systemd.special(7)
Редактировать 5:
Итак, я зашел и почистил скрипт, и убедился, что все работает (запуск из командной строки работает). Вот команды и результат настройки и запуска скрипта:
tracy@tracy-HP17:/usr/lib/systemd/system-sleep$ which ls
/usr/bin/ls
tracy@tracy-HP17:/usr/lib/systemd/system-sleep$ which echo
/usr/bin/echo
tracy@tracy-HP17:/usr/lib/systemd/system-sleep$ ls -la /lib/systemd/system-sleep
total 32
drwxr-xr-x 2 root root 4096 Mar 9 21:30 .
drwxr-xr-x 17 root root 12288 Jan 19 13:39 ..
-rwxr-xr-x 1 root root 405 Mar 9 21:22 20xmodmap
-rwxr-xr-x 1 root root 148 Feb 26 22:01 hdparm
-rw-r--r-- 1 root root 404 Mar 9 20:54 holding.txt
-rwxr-xr-x 1 root root 219 Jul 21 2020 unattended-upgrades
tracy@tracy-HP17:/usr/lib/systemd/system-sleep$ nl 20xmodmap
1 #!/bin/sh
2 # Remap a key to allow context menu access
3 /usr/bin/ls /home/tracy/TestScript/
4 case "$1" in
5 post)
6 # /usr/bin/touch /home/tracy/TestScript/xmodlog.log
7 /usr/bin/echo "post" > /home/tracy/TestScript/xmodlog.log
8 ;;
9 *)
10 # /usr/bin/touch /home/tracy/TestScript/xmodlog.log
11 /usr/bin/echo "default" > /home/tracy/TestScript/xmodlog.log
12 ;;
13 esac
14 /usr/bin/ls /home/tracy/TestScript/
15 exit 0
tracy@tracy-HP17:/usr/lib/systemd/system-sleep$ ls /home/tracy/TestScript
tracy@tracy-HP17:/usr/lib/systemd/system-sleep$ sudo ./20xmodmap
[sudo] password for tracy:
xmodlog.log
tracy@tracy-HP17:/usr/lib/systemd/system-sleep$ ls /home/tracy/TestScript
xmodlog.log
tracy@tracy-HP17:/usr/lib/systemd/system-sleep$ nl /home/tracy/TestScript/xmodlog.log
1 default
tracy@tracy-HP17:/usr/lib/systemd/system-sleep$ rm /home/tracy/TestScript/xmodlog.log
rm: remove write-protected regular file '/home/tracy/TestScript/xmodlog.log'? y
tracy@tracy-HP17:/usr/lib/systemd/system-sleep$ ls /home/tracy/TestScript
Кроме того, ниже приведены две последние строки (по метке времени), показанные journalctl как до сна, так и после возобновления:
Последние две строчки перед сном
Последние две строки после резюме
tracy@tracy-HP17:/usr/lib/systemd/system-sleep$ journalctl -xe | grep 'sleep\|suspend'
Mar 09 21:30:21 tracy-HP17 sudo[132552]: tracy : TTY=pts/0 ; PWD=/usr/lib/systemd/system-sleep ; USER=root ; COMMAND=./20xmodmap
Mar 09 21:37:40 tracy-HP17 sudo[132821]: tracy : TTY=pts/0 ; PWD=/usr/lib/systemd/system-sleep ; USER=root ; COMMAND=./20xmodmap
Похоже, что скрипт не запускается при возобновлении работы, так как вывод из journalctl до и после идентичен....
Редактировать 6:
Хорошо, поэтому, основываясь на комментарии ниже от blitzter47, я углубился в то, что здесь происходит с точки зрения управления питанием. И, похоже, у меня были некоторые (неправильные) предубеждения относительно происходящего.
Во-первых, следуя указаниям в комментарии, выдача, а затем пробуждение системы выполняет скрипт, расположенный в
Итак, это заставило меня задаться вопросом, какая разница была в этой команде и в том, что я делал. И после прочтения статьи « Понимание приостановки » я считаю, что происходило то, что я достигал состояния S1, но что
Итак, я вернулся к тому, чего я на самом деле пытался достичь, а именно к тому, чтобы определенное сочетание клавиш сохранялось, когда система «приостанавливается». Ранее я отмечал, что в некоторых случаях сочетание клавиш сохранялось, когда я возвращался к компьютеру, а в некоторых случаях — нет, но я точно не понял, откуда это взялось. Ну, теперь я утверждаю, что времена, когда он выживал, были времена, когда система просто блокировала экран (т.е. достигала состояния S1), но фактически не приостанавливалась (т.е. не достигала состояния S3). В то время как в тех случаях, когда сочетание клавиш не сохранилось, машина фактически достигла подозрительного состояния (S3) — возможно, из-за того, что ее не трогали в течение более длительного периода времени.
Итак, суть в том, что system-sleep работает правильно для того, что я пытаюсь сделать (теперь, когда я действительно понимаю, что это такое). Итак, моим следующим шагом будет фактическое обновление сценария из Edit 5 (который работает правильно, когда я достигаю приостановки (т.е. состояния S3)) с помощью команды для восстановления моей комбинации клавиш, а затем посмотрите, есть ли ситуации, когда комбинация клавиш не выживает, тогда переоцените то, что происходит в этот момент.
Итак, учитывая все это, я собираюсь отметить исходный ответ blitzter47 как принятый, и если / когда я замечу, что мое сочетание клавиш не сохраняется в определенном состоянии, я опубликую новый вопрос с (надеюсь) лучшим представлением о какова основная причина.
2 ответа
Во-первых, Ubuntu 20.04 использует systemd, а не pm. Во-вторых, содержимое скрипта с systemd отличается. Вы должны попробовать этот шаблон ниже и поместить свой скрипт в
/lib/systemd/system-sleep/
с исполняемым битом:
#!/bin/sh
PATH=/sbin:/usr/sbin:/bin:/usr/bin
case "$1" in
pre)
#code execution BEFORE sleeping/hibernating/suspending
;;
post)
#code execution AFTER resuming
;;
esac
exit 0
Линия, где
PATH=/sbin:/usr/sbin:/bin:/usr/bin
назначается явно, требуется, если вы собираетесь вызывать команды, как в командной строке терминала. Если нет, вы должны использовать абсолютный путь к связанному двоичному файлу команды, например
$ /usr/bin/touch /myfile
вместо
$ touch /myfile
.
Найти абсолютный путь к двоичному файлу команды
Вы можете получить/проверить абсолютный путь к конкретному двоичному файлу команды, например,
$ whereis touch
, который выведет абсолютный путь двоичного файла
/usr/bin/touch
что нас интересует:
$ whereis touch
touch: /usr/bin/touch /usr/share/man/man1/touch.1.gz
Включен ли systemd suspend.target?
Если это не сработает, вы можете проверить, включены ли цели, связанные с systemd, с помощью
$ sudo systemctl status sleep.target suspend.target hibernate.target hybrid-sleep.target
Вывод должен выглядеть так:
● sleep.target - Sleep
Loaded: loaded (/lib/systemd/system/sleep.target; static; vendor preset: enabled)
Active: inactive (dead)
Docs: man:systemd.special(7)
[...]
● suspend.target - Suspend
Loaded: loaded (/lib/systemd/system/suspend.target; static; vendor preset: enabled)
Active: inactive (dead)
Docs: man:systemd.special(7)
[...]
● hibernate.target - Hibernate
Loaded: loaded (/lib/systemd/system/hibernate.target; static; vendor preset: enabled)
Active: inactive (dead)
Docs: man:systemd.special(7)
[...]
● hybrid-sleep.target - Hybrid Suspend+Hibernate
Loaded: loaded (/lib/systemd/system/hybrid-sleep.target; static; vendor preset: enabled)
Active: inactive (dead)
Docs: man:systemd.special(7)
Самый простой способ выполнить сценарий при возобновлении работы — поместить исполняемый файл в расширение . Вот шаги, которые мне удалось выполнить при использовании Ubuntu 18.04 и новее:
Сохраните скрипт в
/etc/pm/sleep.d
с таким именем10_action_description
Убедитесь, что файл принадлежит пользователю root:
sudo chown root:root /etc/pm/sleep.d/10_play_windows_xp_chimes
Убедитесь, что файл является исполняемым:
sudo chmod +x /etc/pm/sleep.d/10_play_windows_xp_chimes
Недавний пример этого процесса — с работающим скриптом — можно найти здесь .
Надеюсь, это поможет вам достичь ваших целей