#python #python-2.7 #ssh
#python #python-2.7 #ssh
Вопрос:
Я перезагружаю удаленную машину через Python, так как это перезагрузка, текущий сеанс ssh прерывается. Запрос не возвращается. Однако меня не интересует возврат.
os.command(‘sshpass -p пароль пользователя ssh @ перезагрузка хоста’)
Код выполняет перезагрузку, однако текущий сеанс завершается, и скрипт никогда не возвращается.
Я могу выполнить асинхронность и просто игнорировать поток, любые другие простые варианты?
Комментарии:
1. Afaik, нет
os.command
; возможно, что вы на самом деле используетеos.system
? Вы пробовалиsubprocess.check_call
вместо этого?2. Можете ли вы подробнее рассказать о том, что вы ожидаете? Что вы подразумеваете под «запрос не возвращается»?
Ответ №1:
Я удивлен, что сценарий не возвращается. Перед перезагрузкой удаленное соединение должно быть сброшено. Вы можете запустить процесс asyc, единственная проблема заключается в том, что подпроцессы, не очищенные их родителями, становятся зомби (все еще занимают место в таблице процессов). Вы можете добавить таймер, чтобы дать сценарию время выполнить свою грязную работу, а затем очистить его в фоновом режиме.
Обратите внимание, что я переключил эту команду на список параметров и пропустил настройку shell=True
. Это просто означает, что промежуточный процесс оболочки не выполняется.
import sys
import subprocess as subp
import threading
import timing
def kill_process(proc):
# kill process if alive
if proc.poll() is None:
proc.kill()
time.sleep(.1)
if proc.poll() is None:
sys.stderr.write("Proc won't dien")
return
# clean up dead process
proc.wait()
proc = subp.Popen(['sshpass', '-p', password, 'ssh', 'user@host', 'reboot')
threading.Timer(5, kill_process, args=(proc,))
# continue on your busy day...