Ошибка, похоже, указывает на то, что sed пытается читать из stdin. Пробовали ли вы выполнить только часть find, чтобы посмотреть, возвращает ли она какой-нибудь файл?
systemd выполнит ExecStop=
всех служб, которые он останавливает во время завершения работы, поэтому ваш скрипт, вероятно, выполняется.
Одна из распространенных проблем заключается в том, что в вашем сервисном блоке (в данном случаеpostgresql.service
)не все зависимости установлены правильно, и в этом случае другая процедура завершения работы (, такая как отключение сети или размонтирование файловых систем ), может происходить параллельно с вашим сценарием.
Чтобы убедиться, что они остаются в рабочем состоянии достаточно долго для завершения сценария ExecStop=
, вы должны перечислить их в зависимостях After=
вашего сервиса. (Порядок завершения работы обратный порядку запуска, поэтому остановка вашей службы произойдет до остановки этих зависимостей. )Например, вы, скорее всего, захотите иметь After=network.target
, если вам нужна сеть в вашем сценарии остановки.
Если вы записываете в файловые системы, отличные от корневой, используйте RequiresMountsFor=
, чтобы убедиться, что они будут доступны во время процедуры.
Если у вас есть journald и постоянное хранилище для него, (я бы сказал, что это вероятно ), вы можете взглянуть на то, что там написано, чтобы узнать, упоминался ли там ваш ExecStop=
скрипт или какие-то ошибки, которые произошло во время его выполнения.
Например, эта команда:
$ journalctl -u postgresql -b -1
В нем будут перечислены все журналы дляpostgresql.service
(при условии, что это точное имя вашей сервисной единицы )при последней загрузке машины(-b -1
означает загрузку перед текущей. )Таким образом, он должен показывать запуск при загрузке и остановку во время завершения работы. Надеюсь, это поможет вам устранить неполадки.
Когда 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=
действия при завершении работы.