【问题标题】:Paramiko SSH - "systemctl status tomcat" returns code 3 when Tomcat is stoppedParamiko SSH - “systemctl status tomcat”在 Tomcat 停止时返回代码 3
【发布时间】:2023-09-12 21:40:01
【问题描述】:

通过 SSH 连接到 Debian 服务器时,以以下 Python 代码为例:

stdin, stdout, stderr = ssh.exec_command('sudo systemctl stop tomcat')
    if stdout.channel.recv_exit_status() != 0:
        for line in iter(stderr.readline, ""):
                print(line)

stdin, stdout, stderr = ssh.exec_command('sudo systemctl status tomcat')
if stdout.channel.recv_exit_status() != 0:
        for line in iter(stderr.readline, ""):
                print(line)

第二个 SSH 命令的

stdout.channel.recv_exit_status() 返回 3 - 不管这意味着什么。 是 SSH 返回码吗? Debian 主机返回码?文档建议后者:http://docs.paramiko.org/en/stable/api/channel.html(“服务器上进程的退出代码(作为 int)。”)

比较有趣的是,如果我用同样的命令启动 Tomcat,然后调用服务的状态,它返回0,从而让我相信我无论出于何种原因都无法获得状态Tomcat停止时。然而,如果我自己通过 SSH 连接到服务器,无论 Tomcat 是否启动,status 命令都会起作用。

对此的任何帮助将不胜感激。

【问题讨论】:

    标签: python tomcat ssh debian paramiko


    【解决方案1】:

    如果tomcat停止,systemctl status tomcat会返回3作为退出码,所以这个行为是正常的。

    systemctl status <service>的退出码会指示请求服务的状态,而不是实际检查是否成功。

    如果你在tomcat停止的时候运行systemctl status tomcat,然后运行echo $?,你会看到退出码是3。如果tomcat正在运行,它应该返回0。

    systemctl status 在这方面遵循 LSB 规范——可能的退出代码的完整列表在这里:https://refspecs.linuxbase.org/LSB_3.1.1/LSB-Core-generic/LSB-Core-generic/iniscrptact.html

    【讨论】:

    • 谢谢,但是为什么相同的命令在启动时返回 0 呢?我只对获取状态的命令是否成功感兴趣 - 我并不特别关心服务是否已启动或停止(稍后会出现)。
    • systemctl status的退出码会指示请求服务的状态,而不是在实际检查中是否成功。如果你在tomcat停止的时候运行systemctl status tomcat,然后运行echo $?,你会看到退出码是3。如果tomcat正在运行,它应该返回1。systemctl status在这方面遵循LSB规范——可能的退出代码的完整列表在这里:refspecs.linuxbase.org/LSB_3.1.1/LSB-Core-generic/…。我已将以上内容添加到我的答案中,因为我对此不是很清楚!