Ubuntu 20.04 - запуск сценария при завершении работы / restart

Я безуспешно пытаюсь запустить сценарий при выключении и перезагружаться. У меня есть сценарий для запуска от имени пользователя root при запуске, и он работает нормально: сохранил сценарий в /etc/init.d, создал ссылку на него в /etc/rc2.d, начиная с S99, и сделал его исполняемым. После некоторого исследования я сделал то же самое с сценарий выключения, создающий ссылки в /etc/rc0.d и /etc/rc6.d, делая его исполняемым и начинающий ссылку с именем «K99myscript», но скрипт не запускается. Я попытался изменить связывает имя с 'K00myscript' для запуска раньше других, меняя его с sh на bash (#! / bin / sh на #! / bin / bash), но ничего не помогает. Я бегу g Xubunto и с помощью 'systemctl poweroff' для выключения и 'systemctl reboot' для перезапуска. Это устаревший метод?

Я также пытался создать .service в / etc / systemd / system как предложено:

[Unit]
Description=Pre-Shutdown Processes
DefaultDependencies=no
Before=shutdown.target reboot.target halt.target kexec.target

[Service]
Type=oneshot
User=root
Group=root
ExecStart=/etc/init.d/myscript

[Install]
WantedBy=shutdown.target reboot.target halt.target kexec.target

Как с полями пользователя / группы, так и без них, но это не сработало ...

1
задан 10 August 2021 в 08:56

1 ответ

[РЕШЕНО] Быть немного упрямым иногда является хорошим путем для решения. Тем не менее, спасибо за ваш вклад. После некоторых исследований, основанных на ссылке моего предыдущего комментария (ответ Себастьяна Старка), я получил этот скрипт (назовем его «myoffscript») в моей папке /etc/init.d:

#!/bin/sh
### BEGIN INIT INFO
# Required-Start:    $local_fs
# Required-Stop:     $local_fs
# Provides:          Shutdown or Reboot Exec
# Default-Start:     4
# Default-Stop:      0 6
# Description:       Shutdown or Reboot
### END INIT INFO

case "$1" in
    stop)
             echo $(date) >> /ZZZdate # REPLACE PREVIOUS EXAMPLE: EXECUTE SHUTDOWN/REBOOT COMMANDS HERE
         ;;
esac

exit 0

Что касается приведенного выше скрипта, наиболее важным для выделения является:

1 - Заголовок LSB (Linux Standard Base) - уровни запуска 'Default-Start' и 'Default-Stop' должны присутствовать, соответствующие '0' для завершения работы (rc0.d) и '6' для перезагрузки (rc6.d). Поскольку мой скрипт предназначен только для выключения и перезагрузки, а должен быть указан 'Default-Start', я выбрал '4' (rc4.d) ведьма не используется/определяется пользователем. Но он должен быть запущен на уровне '2' (rc2.d), если требуется запуск чего-либо во время загрузки (например, службы, демона,...)

2 - Оператор case - Поскольку скрип выполняется systemd как service с аргументами 'start' или 'stop' согласно 'Default-Start' и 'Default-Stop' из заголовка LSB, все команды должны находиться внутри оператора case. (Команды, ранее заданные case, игнорировались в моих тестах.) В соответствии с уровнями выполнения '0' и '6', в моем операторе case есть только опция stop), но если требуется запуск во время загрузки, должна быть включена опция start) (а уровень запуска '2' должен быть указан в заголовке LSB 'Default-Start').

Теперь давайте заставить его работать. Сначала сделайте скрипт /etc/init.d/myoffscript исполняемым файлом. Затем у нас есть два варианта - с помощью команды или вручную.

С помощью команды:

# systemctl enable myoffscript

или

# /lib/systemd/systemd-sysv-install enable myoffscript

Относительные символьные ссылки будут автоматически созданы в соответствующих папках rc*.d (S01myoffscript в rc4.d и K01myoffscript в rc0.d и rc6.d в соответствии с приведенным выше сценарием) Команды будут работать только в том случае, если ссылки не были созданы ранее. В противном случае будут сообщены об ошибках.

Вручную: Из каждого rc*.d папка создать символьную ссылку

# cd /etc/rc4.d
# ln -s ../init.d/myoffscript S01myoffscript
# cd /etc/rc0.d
# ln -s ../init.d/myoffscript K01myoffscript
# cd /etc/rc6.d
# ln -s ../init.d/myoffscript K01myoffscript

Примечание: если уровень запуска '2' был указан в 'Default-Start', то первая ссылка должна быть создана в /etc/rc2.d и так далее... Перезагрузите систему, и все должно работать.

Это единственный способ, который я нашел для запуска сценария в качестве root как при завершении работы, так и при перезагрузке с помощью Ubuntu 20.04

Примечание: Несмотря на /etc/int.d и /etc/rc2.d метод ссылок все еще работает для запуска сценариев / команд во время загрузки, как упоминалось в моей предыдущей ссылке на комментарий, долгосрочный подход будет заключаться в преобразовании сценариев init в systemd service units, поэтому заголовок LBS с описанным выше методом case statement может быть полезен для сценариев / команд запуска через несколько времени.

1
ответ дан 20 August 2021 в 10:28

Другие вопросы по тегам:

Похожие вопросы: