我们有一个使用 sysV 的旧版 Ubuntu (12.04)。由于 LTS 已用完,我们需要切换到 16.04。
其中一个主要变化是从 SysV 更改为 systemd。我们注意到,当我们进行此更改时,我们执行任何类型的代码ssh root@thisismyhostname "shutdown -h now"
都会挂起,而以前它会启动关闭,返回 EXIT_SUCCESS 并关闭连接。然而,使用 systemd,似乎连接保持打开状态。我找到了解决办法,那就是我们需要安装并启用 PAM,并且必须从 更改为 ,shutdown -h now
以便systemctl poweroff
systemd 可以遍历连接并在关闭之前关闭它们,这是我们想要的功能。
现在发生的问题是,大概有 1/20 的时间,似乎存在一种竞争条件,即关机将获得足够的 CPU 来关闭系统,这导致 SSH 返回 255(连接关闭的返回代码)而不是返回从 SSH 运行的关机命令的 EXIT_SUCCESS。
不幸的是,我们在代码中不止一个地方调用了关机,我觉得检查 EXIT_SUCCESS 或 SSH 的 255 有点不靠谱。有人知道如何让带有 systemd 的 Ubuntu 16.04 在调用后返回 EXIT_SUCCESSsystemctl poweroff
吗?
答案1
考虑使用systemctl
通过 ssh 将其自己的命令发送到远程主机的功能。
从手册页中:
-H, --host=
Execute the operation remotely. Specify a hostname, or a username
and hostname separated by "@", to connect to. The hostname may
optionally be suffixed by a container name, separated by ":", which
connects directly to a specific container on the specified host.
This will use SSH to talk to the remote machine manager instance.
Container names may be enumerated with machinectl -H HOST.
它的工作原理如下:
# ssh-copy-id -i ~/.ssh/id_ed25519.pub 172.25.50.100
...
# systemctl -H 172.25.50.100 status
● 172.25.50.100
State: degraded
Jobs: 0 queued
Failed: 1 units
Since: Thu 2017-03-02 01:56:07 EST; 17h ago
CGroup: /
# systemctl -H 172.25.50.100 poweroff
# echo $?
0