[РЕШЕНО]
Иногда быть немного упрямым — это хороший путь к решению. Тем не менее, спасибо за ваш вклад.
После некоторого исследования, основанного на ссылке моего предыдущего комментария (ответ Себастьяна Старка), я получил этот скрипт (давайте назовем его «myoffscript») в моей папке /etc/init.d:
#!/бин/ш
### НАЧАЛО ИНФОРМАЦИИ
# Обязательное начало: $local_fs
# Обязательная остановка: $local_fs
# Обеспечивает: завершение работы или перезагрузка Exec
# Старт по умолчанию: 4
# Стоп по умолчанию: 0 6
# Описание: Выключение или перезагрузка
### КОНЕЦ ИНФОРМАЦИИ
случай "$1" в
останавливаться)
echo $(date) >> /ZZZdate # ЗАМЕНИТЬ ПРЕДЫДУЩИЙ ПРИМЕР: ВЫПОЛНИТЬ КОМАНДЫ ВЫКЛЮЧЕНИЯ/ПЕРЕЗАГРУЗКИ ЗДЕСЬ
;;
эсак
выход 0
Что касается приведенного выше скрипта, наиболее важно выделить:
1 - Заголовок LSB (стандартная база Linux) ✓ Должны присутствовать оба уровня запуска «Default-Start» и «Default-Stop», соответствующие «0» для выключения (rc0.d) и «6» для перезагрузки. (rc6.d). Так как мой сценарий предназначен только для выключения и перезагрузки и должен быть указан «Запуск по умолчанию», я выбрал «4» (rc4.d), который не используется/определяется пользователем. Но это должен быть уровень запуска «2» (rc2.d), если требуется запуск чего-либо во время загрузки (например, службы, демона и т. д.).
2 - Постановка дела - Как сценарий исполняется системад как оказание услуг с аргументами «start» или «stop» в соответствии с «Default-Start» и «Default-Stop» из заголовка LSB, все команды должны быть внутри корпуса утверждение. (Команды перед оператором case в моих тестах игнорировались.) Соответствуя уровням запуска «0» и «6», мой оператор case имеет только останавливаться) вариант, но если требуется запуск во время загрузки, Начало) опция должна быть включена (и уровень запуска «2» должен быть указан в заголовке LSB «Default-Start»).
Теперь давайте заставим это работать.
Сначала сделайте скрипт /etc/init.d/myoffscript исполняемым.
Тогда у нас есть два варианта - с команда или же вручную.
С командой:
# systemctl включить myoffscript
или же
# /lib/systemd/systemd-sysv-install включить myoffscript
Относительные символические ссылки будут автоматически созданы в соответствующих папках rc*.d (S01myoffscript в rc4.d и K01myoffscript в rc0.d и rc6.d в соответствии со сценарием выше)
Команды будут работать только в том случае, если ссылки не были созданы ранее. В противном случае будет сообщено об ошибках.
Вручную:
Из каждой папки rc*.d создайте символическую ссылку
# компакт-диск /etc/rc4.d
# ln -s ../init.d/myoffscript S01myoffscript
# компакт-диск /etc/rc0.d
# ln -s ../init.d/myoffscript K01myoffscript
# компакт-диск /etc/rc6.d
# ln -s ../init.d/myoffscript K01myoffscript
Примечание: если в «Default-Start» был указан уровень выполнения «2», первая ссылка должна быть создана в /etc/rc2.d и так далее...
Перезапустите систему и все должно заработать.
Это единственный способ запустить скрипт от имени пользователя root как при завершении работы, так и при перезагрузке в Ubuntu 20.04.
Примечание: Несмотря на /etc/int.d и /etc/rc2.d метод links по-прежнему работает для запуска сценариев/команд во время загрузки, как упоминалось в моей предыдущей ссылке на комментарий, долгосрочным подходом было бы преобразование сценариев инициализации в единицы обслуживания systemd., поэтому заголовок LBS с описанным выше методом оператора case может быть полезен для сценариев/команд запуска через некоторое время.