У меня есть сценарий выключения, который отлично работает после cli reboot
или shutdown
, но никогда не выполняется, когда экземпляр остановлен или завершен из консоли aws.
[Unit]
Description=Gracefully shut down remnode to avoid database dirty flag
DefaultDependencies=no
After=poweroff.target shutdown.target reboot.target halt.target kexec.target
RequiresMountsFor=/data
Requires=network-online.target network.target data.mount
[Service]
Type=oneshot
ExecStop=/root/node_shutdown.sh
RemainAfterExit=yes
KillMode=none
[Install]
WantedBy=multi-user.target
Что мне не хватает?
РЕДАКТИРОВАТЬ
Здесь journalctl
журнал для моей службы. Первые две записи reboot
через cli последние 3 записи - это 2 остановки экземпляра из консоли AWS. Как видите, нет даже упоминания о прекращении обслуживания во время остановки экземпляра. Однако перезагрузка из cli выводит мое эхо и системные журналы запуска, а также завершение работы службы.
-- Logs begin at Sun 2019-10-13 13:02:54 UTC, end at Mon 2019-10-14 19:41:01 UTC. --
Oct 13 13:03:24 ip-10-0-1-182 systemd[1]: Started Gracefully shut down remnode to avoid database dirty flag.
Oct 14 19:27:23 ip-10-0-1-182 systemd[1]: Stopping Gracefully shut down remnode to avoid database dirty flag...
Oct 14 19:27:23 ip-10-0-1-182 node_shutdown.sh[10635]: RUNNING SHUTDOWN SCRIPT
Oct 14 19:27:23 ip-10-0-1-182 systemd[1]: Stopped Gracefully shut down remnode to avoid database dirty flag.
-- Reboot --
Oct 14 19:27:37 ip-10-0-1-182 systemd[1]: Started Gracefully shut down remnode to avoid database dirty flag.
Oct 14 19:28:17 ip-10-0-1-182 systemd[1]: Stopping Gracefully shut down remnode to avoid database dirty flag...
Oct 14 19:28:17 ip-10-0-1-182 node_shutdown.sh[1712]: RUNNING SHUTDOWN SCRIPT
Oct 14 19:28:18 ip-10-0-1-182 systemd[1]: Stopped Gracefully shut down remnode to avoid database dirty flag.
-- Reboot --
Oct 14 19:28:32 ip-10-0-1-182 systemd[1]: Started Gracefully shut down remnode to avoid database dirty flag.
-- Reboot --
Oct 14 19:34:05 ip-10-0-1-182 systemd[1]: Started Gracefully shut down remnode to avoid database dirty flag.
-- Reboot --
Oct 14 19:40:26 ip-10-0-1-182 systemd[1]: Started Gracefully shut down remnode to avoid database dirty flag.
РЕДАКТИРОВАТЬ 2:
Потому что похоже shutdown
триггер в основном никогда не запускается, я также пробовал настроить ядро sysctl kernel.poweroff_cmd
к /bin/systemctl poweroff
следуя этой теме. Надеясь, что это вызовет четное, но не повезло.
У меня была точно такая же проблема с Ubuntu 18.04 AMI. Я прочитал указанную выше статью и попытался обновить пакеты.
> sudo apt update
> sudo apt upgrade
Я не знаю почему, но теперь он работает нормально, даже когда экземпляр EC2 выключен через веб-консоль. И есть новые скрипты, связанные с acpi, которые отсутствовали (hibinit-power
, hibinit-power.sh
). Хотите попробовать?
Просто догадка, но, возможно, стоит изучить:
Вы пробовали использовать Before=
с участием ExecStart=
вместо того After=
с участием ExecStop=
? т.е. запустить скрипт node_shutdown.sh до того, как будет достигнуто конечное состояние выключения / остановки / перезагрузки. Есть ответы на похожие вопросы Вот и Вот которые намекают на это.
Тем не менее, в принятом ответе на первый связанный вопрос не используется ни один из вариантов! И почему он работает при выключении вручную, а не при выключении консоли, я не уверен. Я знаю, что завершение работы консоли регистрируется как событие «нажата кнопка питания» - может быть, ОС по-другому обрабатывает это событие?
Нажатие кнопки питания запускает событие ACPI, которое (я думаю) запускается /etc/acpi/events/hibinit-power
=> /etc/acpi/actions/hibinit-power.sh
, который сам отправляет команду выключения питания на шину сообщений. Возможно, стоит проверить содержимое этого .sh на случай, если там есть что-то странное. Моя ванильная Ubuntu 18.04 выглядит так:
#!/bin/sh
# shut down system in a way that respects inhibitors
# see: https://github.com/systemd/systemd/pull/9356
dbus-send --system --print-reply --dest=org.freedesktop.login1 /org/freedesktop/login1 org.freedesktop.login1.Manager.PowerOff boolean:false
Как предлагает asktyagi, вероятно, стоит определить, действительно ли скрипт запущен - может быть, попробовать записать в журнал в верхней части скрипта node_shutdown?
Изменить - вот содержимое следующих файлов:
/ и т. д. / acpi / события / hibinit-мощность
event=button/power
action=/etc/acpi/actions/hibinit-power.sh "%e"
/ и т. д. / акпи / события / хибинит-сон
# ACPID config to power down machine if powerbutton is pressed, but only if
# no gnome-power-manager is running
event=button/sleep.*
action=/etc/acpi/actions/sleep.sh %e
/etc/acpi/actions/sleep.sh
#!/bin/sh
#PATH=/sbin:/bin:/usr/bin
do_hibernate() {
if [ -d /run/systemd/system ]; then
systemctl hibernate
else
pm-hibernate
swapoff /swap-hibinit
fi
}
case "$2" in
SBTN)
swapon /swap-hibinit && do_hibernate
;;
*)
logger "ACPI action undefined: $2" ;;
esac
Еще одна вещь, которую нужно проверить, это /etc/systemd/logind.conf
чтобы увидеть, как система обрабатывает нажатие клавиши питания. Похоже, что у меня установлены все значения по умолчанию, особенно следующие:
[Login]
...
#HandlePowerKey=poweroff
#HandleSuspendKey=suspend
#HandleHibernateKey=hibernate
...
#PowerKeyIgnoreInhibited=no
#SuspendKeyIgnoreInhibited=no
#HibernateKeyIgnoreInhibited=no
Я дважды проверил это с помощью свежего экземпляра Ubuntu, созданного из стандартного образа AWS (ami-02df9ea15c1778c9c в EU-West-1)