Как запускать команды на выключение с помощью systemd?

У меня есть локальный postgresql на каждой машине. Я хочу запускать сценарии обслуживания при завершении работы, чтобы пользователи могли нажимать «Выключить» и уходить, пока машина выполняет техническое обслуживание, а затем фактически завершать работу после завершения.

Сценарий должен быть запущен до остановки postgresql.service.

Я также хочу отобразить сообщение о выключении, информирующее пользователя о том, где будет проводиться техническое обслуживание.

Я попытался создать службу:

[Unit]
Description=PostgreSQL Maintenance
Requires=postgresql.service
Before=shutdown.target

[Service]
User=postgres
WorkingDirectory=/opt/postgres
ExecStart=/bin/true
ExecStop=/opt/postgres/run-maintenance.sh

[Install]
WantedBy=multi-user.target

и:

[Unit]
Description=PostgreSQL Maintenance
Requires=postgresql.service

[Service]
Type=oneshot
User=postgres
WorkingDirectory=/opt/postgres
ExecStart=/opt/postgres/run-maintenance.sh

[Install]
WantedBy=halt.target shutdown.target

Они не работают.

Сценарий обслуживания:

#!/usr/bin/env bash

plymouth display-message --text="Maintenance Message"
psql -d db -f /opt/postgres/maintenance.sql

maintenance.sql

reindex (verbose) database db;
vacuum (full, analyze, verbose);

Я нашел много похожих вопросов, но не нашел окончательного решения.

4
задан 31 July 2019 в 17:46

3 ответа

Это работало на меня:

[Unit]
Description=PostgreSql Maintenance.
After=postgresql.service

[Service]
Type=oneshot
User=postgres
WorkingDirectory=/opt/postgres
ExecStart=/opt/postgres/run-maintenance.sh
TimeoutSec=3600

[Install]
WantedBy=shutdown.target halt.target
1
ответ дан 1 December 2019 в 10:14

Вот пример простого сервиса, который выполняет задачу перед завершением работы. Обратите внимание на то, что зависимости по умолчанию отключены DefaultDependencies=no опция (я предполагаю, что пропуск этой конфигурации является главной причиной, почему Ваш oneshot файл единицы не работает). Как указано другими комментариями, это - вероятно, хорошая идея иметь RemainAfterExit=yes опция также. Я также соглашаюсь с опасениями по поводу тайм-аута, сделанного в комментариях.

[Unit]
Description=SleepBeforeShutdown Service
DefaultDependencies=no
Before=halt.target shutdown.target reboot.target

[Service]
Type=oneshot
ExecStart=/bin/sleep 30
RemainAfterExit=yes

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

После редактирования Вашего сервисного выполненного файла единицы systemctl enable yourservice.service и перезагрузка. После этого любое время, Вы выполняете завершение работы, останов или перезагрузку, сервис типа-oneshot, сделает свою вещь сначала перед системными доходами с фактическим завершением работы/перезагрузкой.

Править
Я теперь нашел предыдущее сообщение, где то же решение предлагалось. У меня нет кредитов для добавления комментариев со ссылкой на вопрос выше, таким образом, я оставлю свой ответ, как (даже при том, что строго говоря это - дубликат) (Модераторы, удалите это сообщение, если это нарушает правила),

Редактирование 2
И все же другое старое сообщение с тем же ответом.

1
ответ дан 1 December 2019 в 10:14

Ваша первая попытка близко к корректному. Моя рекомендация состояла бы в том, чтобы использовать единицу с ExecStop= чтобы команды работали, в то время как система закрывается, поскольку это - самый надежный способ сделать так, и легко разобраться в упорядочивании.

Один важный момент должен использовать Type=oneshot и RemainAfterExit=yes, это гарантирует, что Ваша единица будет "запущена" и останется в том состоянии, пока система не понизится. После того как это начинает понижаться, это будет полагать, что Ваша единица как одну из единиц останавливается, и выполнится ExecStop= команда на нем.

Относительно зависимостей Вы устанавливаете их относительно запуска единицы, таким образом, Вы заявляете все, что должно произойти, когда Ваша единица начинает. Когда система понижается, зависимости останавливаются в обратном порядке, поэтому если Вы хотите, чтобы PostgreSQL возрос, в то время как Ваша единица останавливается, Вам нужно After= зависимость от него.

Вам не нужны никакие зависимости от завершения работы, и т.д. так как это точно так же, как нормальная единица (запускается на начальной загрузке, или запускается вручную, в то время как система работает, остановки на завершении работы, поскольку все другие единицы останавливаются также.)

Соединение всего этого:

[Unit]
Description=PostgreSQL Maintenance
After=postgresql.service

[Service]
Type=oneshot
RemainAfterExit=yes
User=postgres
WorkingDirectory=/opt/postgres
ExecStart=/bin/true
ExecStop=/opt/postgres/run-maintenance.sh
TimeoutSec=3600

[Install]
WantedBy=multi-user.target
0
ответ дан 1 December 2019 в 10:14

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

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