Использование systemd Я хочу, чтобы моя команда Postgresql ExecStop выполнялась при завершении работы

Ошибка, похоже, указывает на то, что sed пытается читать из stdin. Пробовали ли вы выполнить только часть find, чтобы посмотреть, возвращает ли она какой-нибудь файл?

2
06.02.2019, 23:04
2 ответа

systemd выполнит ExecStop=всех служб, которые он останавливает во время завершения работы, поэтому ваш скрипт, вероятно, выполняется.

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

Чтобы убедиться, что они остаются в рабочем состоянии достаточно долго для завершения сценария ExecStop=, вы должны перечислить их в зависимостях After=вашего сервиса. (Порядок завершения работы обратный порядку запуска, поэтому остановка вашей службы произойдет до остановки этих зависимостей. )Например, вы, скорее всего, захотите иметь After=network.target, если вам нужна сеть в вашем сценарии остановки.

Если вы записываете в файловые системы, отличные от корневой, используйте RequiresMountsFor=, чтобы убедиться, что они будут доступны во время процедуры.

Если у вас есть journald и постоянное хранилище для него, (я бы сказал, что это вероятно ), вы можете взглянуть на то, что там написано, чтобы узнать, упоминался ли там ваш ExecStop=скрипт или какие-то ошибки, которые произошло во время его выполнения.

Например, эта команда:

$ journalctl -u postgresql -b -1

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

3
27.01.2020, 22:08

Когда systemdзапускает службы, также создается выделенная группа управления(cgroupдля краткости )для каждой службы. Вы можете запустить что-то вроде ps ax -O cgroup:150 | grep system.slice, чтобы увидеть контрольные группы, назначенные каждой службе, хотя список будет довольно обширным.

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

Выполнение ExecStop=действий при завершении работы для служб, которые, как известно, уже отключены, было бы бесполезным, поэтому systemdони будут пропущены.

Если у вас есть администратор базы данных, который не желает изучать systemctlкоманды, отдельный инструмент управления, который будет останавливаться и запускаться postgresqlтрадиционным способом по мере необходимости, или хорошо -изученный павловский рефлекс для сделать это самостоятельно в рамках некоторых операций с базой данных, вы можете рассмотреть возможность изменения единицы измерения postgresql.serviceна:

Type=oneshot
RemainAfterExit=true

Это предотвратит systemdотслеживание фактического состояния ядра базы данных PostgreSQL, но позволит останавливать и перезапускать ядро ​​базы данных традиционным способом по желанию, не ставя под угрозу ExecStop=действия при завершении работы.

0
27.01.2020, 22:08

Теги

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