Рейтинг:1

Ubuntu 20.04 — запуск скрипта при выключении/перезагрузке

флаг pe

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

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

[Ед. изм]
Description=Процессы перед завершением работы
DefaultDependencies=нет
До=shutdown.target reboot.target halt.target kexec.target

[Оказание услуг]
Тип = ваншот
Пользователь=корень
Группа=корень
ExecStart=/etc/init.d/myscript

[Установить]
WantedBy=shutdown.target reboot.target halt.target kexec.target

Как с полями User/Group, так и без них, но это не сработало...

sudodus avatar
флаг jp
Почему важно запускать скрипт при завершении работы? Достаточно ли будет запускать все сценарии при загрузке (как при холодной загрузке, так и при перезагрузке)? В этом случае вы можете использовать `@reboot` в `crontab`.
FedKad avatar
флаг cn
Отвечает ли это на ваш вопрос? [Как запустить команду ДО завершения работы в Ubuntu 21.04] (https://askubuntu.com/questions/1335022/how-to-run-a-command-before-shutdown-on-ubuntu-21-04)
флаг pe
На уровне пользователя было бы легко выполнять некоторые задачи при выключении, перезагрузке, выходе из системы… XFCE имеет для этого приятный графический интерфейс, используя только файлы .desktop. Но мне нужно выполнить их как root. Метод службы systemd не работал, даже если пользователь и группа были указаны как root. Но я нашел здесь несколько хороших подсказок: [18.04 — insserv отсутствует в Ubuntu 18] (https://askubuntu.com/questions/1048330/insserv-missing-on-ubuntu-18) Хотя мне нужно немного больше изучить его и понять, как должен быть настроен заголовок LSB. Насколько я знаю, метод rc*.d устаревает.
sudodus avatar
флаг jp
Если мы не говорим о проблемах безопасности или конфиденциальности, я думаю, что достаточно использовать @reboot в crontab. Вы запускаете его с правами суперпользователя через `sudo crontab -e`. В противном случае я предлагаю обходной путь: создайте «настраиваемое отключение», **файл рабочего стола**, который выполняет сценарий оболочки, который запускает ваши специальные задачи, а затем выполняет завершение работы.
Рейтинг:1
флаг pe

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

sudodus avatar
флаг jp
Спасибо, что поделились этим решением :-)

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.