通过 SSH 关闭机器不返回退出值

通过 SSH 关闭机器不返回退出值

我们有一个使用 sysV 的旧版 Ubuntu (12.04)。由于 LTS 已用完,我们需要切换到 16.04。

其中一个主要变化是从 SysV 更改为 systemd。我们注意到,当我们进行此更改时,我们执行任何类型的代码ssh root@thisismyhostname "shutdown -h now"都会挂起,而以前它会启动关闭,返回 EXIT_SUCCESS 并关闭连接。然而,使用 systemd,似乎连接保持打开状态。我找到了解决办法,那就是我们需要安装并启用 PAM,并且必须从 更改为 ,shutdown -h now以便systemctl poweroffsystemd 可以遍历连接并在关闭之前关闭它们,这是我们想要的功能。

现在发生的问题是,大概有 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

相关内容