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
)。您想尝试一下吗?