Назад | Перейти на главную страницу

Остановка и завершение инстанса AWS не выполняют сценарий остановки systemd

У меня есть сценарий выключения, который отлично работает после 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)