AWS 实例停止和终止不会执行 systemd 停止脚本

AWS 实例停止和终止不会执行 systemd 停止脚本

reboot我有一个关闭脚本,它在 cli或之后执行得很好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 获得的,后三个条目是来自 AWS 控制台的 2 个实例停止。如您所见,甚至没有提到在实例停止期间关闭我的服务。但是从 cli 重新启动会输出我的 echo 和系统日志,包括服务的启动和关闭。

-- 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 关注此主题。希望它能够引发事件,但没有运气。

答案1

只是一种预感,但可能值得探索:

您是否尝试过使用Before=withExecStart=而不是After=with ExecStop=?即在达到关机/停止/重启的最终状态之前启动 node_shutdown.sh 脚本。类似问题有答案这里这里暗示这一点。

话虽如此,第一个链接问题的可接受答案不使用任何选项!至于为什么它在手动关机时有效,但在控制台关机时无效,我不确定。我知道控制台关机注册为“按下电源按钮”事件 - 也许操作系统对这个事件的处理方式不同?

按下电源按钮会触发 ACPI 事件,我认为它会运行/etc/acpi/events/hibinit-power=> /etc/acpi/actions/hibinit-power.sh,它本身会向消息总线发送 poweroff 命令。可能值得检查一下 .sh 的内容,以防其中有任何异常。我的 vanilla 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 脚本的顶部写入日志?

编辑-以下是以下文件的内容:

/etc/acpi/events/hibinit-power

event=button/power
action=/etc/acpi/actions/hibinit-power.sh "%e"

/etc/acpi/events/hibinit-sleep

# 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

我使用基于 AWS 库存映像(EU-West-1 中的 ami-02df9ea15c1778c9c)构建的全新 Ubuntu 实例仔细检查了这一点

答案2

我在 Ubuntu 18.04 AMI 上遇到了完全相同的问题。我阅读了上述文章并尝试更新软件包。

> sudo apt update
> sudo apt upgrade

我不知道为什么,但现在即使通过 Web 控制台关闭 EC2 实例,它也能正常工作。并且缺少新的 acpi 相关脚本(hibinit-power, hibinit-power.sh)。您想尝试一下吗?

相关内容