Как аккуратно завершиться по кнопке питания?

Хочется, чтобы по кнопке питания сначала вызывался скрипт, который аккуратно позавершает всё иксовое (с запросами сохранения, если надо), и только потом чтобы делалось собственно завершение системы. Оптимизм внушает такой текст из man systemd-halt.service

Immediately before executing the actual system halt/poweroff/reboot/kexec
systemd-shutdown will run all executables in /usr/lib/systemd/system-shutdown/
and pass one arguments to them: either "halt", "poweroff", "reboot" or "kexec",
depending on the chosen action. All executables in this directory are executed
in parallel, and execution of the action is not continued before all executables
finished.

Делаю так.
1.
  1. В файле /etc/systemd/logind.conf прописываю
  2. HandlePowerKey=poweroff
  3. В каталоге /usr/lib/systemd/system-shutdown/ помещаю скрипт pre-shutdown:
    #!/bin/sh
    touch /var/log/pre-shutdown.log
    echo $1 >> /var/log/pre-shutdown.log
    
  4. Тыкаю кнопку питания
После выключения и включения в /var/log файла pre-shutdown.log нет. ЧЯДНТ?

Upd.
-rwxr-xr-x 1 root root 75 Авг 30 17:32 pre-shutdown
akorop
После выключения и включения в /var/log файла pre-shutdown.log нет. ЧЯДНТ?
Я делаю лог shutdown (/usr/lib/systemd/system-shutdown/debug.sh,) в случае проблем так (уже писал не однократно)
#!/bin/sh
mount -o remount,rw /
dmesg > /var/log/shutdown.log
mount -o remount,ro /
UPD .... и дополнительно увеличиваю информативность, в меню/консоль grub прописываю - systemd.log_level=debug systemd.log_target=kmsg log_buf_len=1M
Ошибки не исчезают с опытом - они просто умнеют
не на том уровне хочешь выполнение скрипта по завершению граф программ.
это нужно делать как минимум в пользовательском пространстве. поищи в возможностях WM.

у меня кеды реагирует на кнопку выключения и сохраняют сессию.
Псевдографический инсталлятор Arch Linux ver. 3.8.2
Благодарности принимаются на ЯД 410012815723874
с помощью systemd в пространстве пользователя это делается с помощью сервиса
вот только что на ваял, работает.
~/.config/systemd/user/sht.service
[Unit]
Description=test before shutdown
Before=shutdown.target
DefaultDependencies=no

[Service]
Type=oneshot
ExecStart=/usr/bin/touch %h/test_before_shutdown
RemainAfterExit=yes

[Install]
WantedBy=shutdown.target
systemctl --user enable sht
но, возможно тебе это не подойдет, повторю "поищи в возможностях WM."
не забываем о параллельных выполнениях, WM может быть убита и до выполнения этого сервиса, соответственно команды выполнятся но смысла от них будет ноль.

а там где ты это изначально хотел делать это полностью не правильное место.
Псевдографический инсталлятор Arch Linux ver. 3.8.2
Благодарности принимаются на ЯД 410012815723874
А я попробовал такой способ (когда то попался на глаза такой способ) -
создал пустой сервис, который ничего не делает, но останов его (Exec_Stop) при завершении сессии будет обращаться к скрипту выключения.
/lib/systemd/system/my_shutdown.service
[Unit]
Description=Script to exec on shutdown

[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/bin/true
ExecStop=/home/vasek/shutdown_script.sh

[Install]
WantedBy=multi-user.target
Для проверки сделал простой скрипт shutdown_script.sh
#!/bin/sh
cat /home/vasek/shutdown_script.sh > /home/vasek/log.txt
exit 0
Все работает, лог появился.
Но есть одно но — нужно смотреть какой юнит делать — системный или пользовательский.
А также, как сказал nafanja, проверить очередность выполнения закрытия приложений. А вот для этого я рекомендую использовать лог shutdown, приведенный мной выше (только нужно увеличить информативность вывода)

EDIT1 - проверить очередность выполнения закрытия приложений - не точно выразился, имел ввиду, что раньше сработает - скрипт или закроется WM.
Но, думаю, с большой долей вероятности, что WM закроется раньше - вообщем нужно смотреть.
Но вот для таких операций, как, например, backup, думаю подойдет хорошо.
Ошибки не исчезают с опытом - они просто умнеют
vasek
Description=Script to exec on shutdown
ты тут написал что скрипт выполняется во время выключения компа.
но это не так!
на самом деле твой юнит выполнится во время остановки этого юнита а не при выключении компа.
он сработает и при systemctl stop my_shutdown. а то что он срабатывает и при выключении компа это просто последствие.
поэтому твой вариант это просто костыль.
правильно юнит должен инсталироваться в shutdown.target, тогда он будет выполняться именно при выключении компа.

vasek
Но есть одно но — нужно смотреть какой юнит делать — системный или пользовательский.
это правильно, но у тя там мешанина. сам скрипт живет в папке пользователя как и сохраненный лог, но юнит то системный.
поэтому скрипт должен лежать в /usr/local/bin/, а лог в /var/log/,

vasek
/lib/systemd/system/my_shutdown.service
да и свои системные юниты должны лежать в /etc/systemd/system/ или /usr/local/lib/systemd/system/
свои пользовательские юниты (общие для всех пользователей) тут /etc/systemd/user/ или /usr/local/lib/systemd/user/
а частные пользовательские юниты тут ~/.config/systemd/user/
Псевдографический инсталлятор Arch Linux ver. 3.8.2
Благодарности принимаются на ЯД 410012815723874
nafanja, со всем согласен, привел просто как альтернативу. И, конечно, нужно писать академический юнит, как ты - тут я даже и спорить не собираюсь.
Приведенный юнит не мой, просто мне понравилась идея сервиса пустышки, который ничего не делает, а активируется только в определенный момент.
А понравился это способ своей нестандартностью - я вообще предпочитаю использовать все нестандартное.
А почему юнит системный, а не пользовательский - я написал, нужно решать, какой удобнее .... а для проверки я выбрал системный.
И да, всегда должна быть альтернатива общепринятым методам.
Ошибки не исчезают с опытом - они просто умнеют
 
Зарегистрироваться или войдите чтобы оставить сообщение.