Запуск скрипта при выключении компьютера

Задача: Сделать автоматический запуск нашего скрипта перед перезагрузкой и выключением компьютера.

Для примера создадим скрипт выполняющий обновление системы перед выключением.

Для управления загрузкой и работой сервисов в kubuntu начиная с версии 15.04 используется systemd.

Systemd хранит свои юниты в папке /etc/systemd/system/ туда мы и положим свой новый юнит.

Создаем файл сервиса с именем poweroff_dist_upgrade.service

sudo nano /etc/systemd/system/poweroff_dist_upgrade.service

добавляем в него содержимое

[Unit]
Description=Dist Upgrade before restart and power off
After=systemd-user-sessions.service

[Service]
ExecStop=/bin/bash '/usr/local/bin/distupgrade.sh'
Type=oneshot
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target reboot.target poweroff.target

Unit - общая информация.
Description - описание сервиса.
After - задаёт порядок загрузки. В этом случае после старта сессии пользователя.

Service - содержит информацию о службе
ExecStop - Какой скрипт будет выполнен
Type - Типы службы. oneshot для скриптов, которые выполняют одно задание и завершаются

Install - когда юнит должен быть активирован.

multi-user.target или runlevel3.target соответствует runlevel=3 "Многопользовательский режим без графики"

Назначаем права на запуск
sudo chmod +x /etc/systemd/system/poweroff_dist_upgrade.service

Создаем сам скрипт который будет выполняться
sudo nano /usr/local/bin/distupgrade.sh

#!/bin/bash
apt update && apt dist-upgrade -f -y && apt autoremove -y
echo 'Обновление '$(date '+%m.%d %H:%M') >> /var/log/dist-upgrade_before_power_off.log
exit 0

Делаем скрипты выполняемым
sudo chmod +x /usr/local/bin/distupgrade.sh

Перезагружаем systemd для поиска новых или измененных юнитов:
sudo systemctl daemon-reload

Включаем наш новый юнит
sudo systemctl enable poweroff_dist_upgrade.service

Всё, теперь после этого при выключении и перезагрузки компьютера будет автоматически запускаться наш скрипт /usr/local/bin/distupgrade.sh

Для отключения используем
sudo systemctl disable poweroff_dist_upgrade.service