Paramiko SSH — «systemctl status tomcat» возвращает код 3 при остановке Tomcat

#python #tomcat #ssh #debian #paramiko

#python #tomcat #ssh #debian #paramiko

Вопрос:

Возьмите следующий код Python в качестве примера при подключении через SSH к серверу Debian:

 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)
  

stdout.channel.recv_exit_status() для вторых команд SSH возвращает 3 — что бы это ни значило.
Это код возврата SSH? Код возврата хоста Debian? В документации предлагается последнее: http://docs.paramiko.org/en/stable/api/channel.html («код выхода (как int) процесса на сервере».)

Довольно интересно, что если я запускаю Tomcat с той же командой, а затем вызываю статус службы, он возвращает 0, что наводит меня на мысль, что я по какой-либо причине не могу получить статус Tomcat, когда он остановлен. Тем не менее, если я сам подключаюсь к серверу по SSH, команда status работает независимо от того, запущен Tomcat или нет.

Любая помощь в этом была бы весьма признательна.

Ответ №1:

systemctl status tomcat вернет 3 в качестве кода выхода, если tomcat остановлен, поэтому такое поведение является нормальным.

systemctl status <service> код выхода будет указывать на статус запрошенной службы, а не на успех фактической проверки.

Если вы запустите systemctl status tomcat , когда tomcat остановлен, а затем запустите echo $? , вы увидите, что код выхода равен 3. Если tomcat запущен, он должен возвращать 0.

systemctl status в этом отношении следует спецификации LSB — полный список возможных кодов выхода находится здесь: https://refspecs.linuxbase.org/LSB_3.1.1/LSB-Core-generic/LSB-Core-generic/iniscrptact.html .

Комментарии:

1. Спасибо, но почему, когда та же команда возвращает 0 при запуске? Меня интересует только то, выполнена ли команда для получения статуса успешно — мне все равно, запущена или остановлена служба (это произойдет позже).

2. systemctl status код выхода будет указывать на статус запрошенной службы, а не на успех фактической проверки. Если вы запустите systemctl status tomcat , когда tomcat остановлен, а затем запустите echo $? , вы увидите, что код выхода равен 3. Если tomcat запущен, он должен вернуть 1. systemctl status в этом отношении следует спецификации LSB — полный список возможных кодов выхода здесь: refspecs.linuxbase.org/LSB_3.1.1/LSB-Core-generic /. … Я добавил вышеупомянутое к своему ответу, так как я не очень хорошо понимал это!