У меня есть локальный 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);
Я нашел много похожих вопросов, но не нашел окончательного решения.
Это работало на меня:
[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
Вот пример простого сервиса, который выполняет задачу перед завершением работы. Обратите внимание на то, что зависимости по умолчанию отключены 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
И все же другое старое сообщение с тем же ответом.
Ваша первая попытка близко к корректному. Моя рекомендация состояла бы в том, чтобы использовать единицу с 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