#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 /. … Я добавил вышеупомянутое к своему ответу, так как я не очень хорошо понимал это!