Я безуспешно пытаюсь запустить сценарий при выключении и перезагружаться. У меня есть сценарий для запуска от имени пользователя 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
Как с полями пользователя / группы, так и без них, но это не сработало ...
[РЕШЕНО] Быть немного упрямым иногда является хорошим путем для решения. Тем не менее, спасибо за ваш вклад. После некоторых исследований, основанных на ссылке моего предыдущего комментария (ответ Себастьяна Старка), я получил этот скрипт (назовем его «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 может быть полезен для сценариев / команд запуска через несколько времени.