LINUX.ORG.RU

Django и выполнение команды через ssh

 , ,


1

0

Короче ситуация такая, с клиента посылается POST запрос. Сервер обрабатывает и выполняет скрипт, пример:

ssh test@test.ru 'command1; command2;'
В представлении оно выполняется обычным os.system(cmd). И если ssh завершается с ошибкой, например Connection refused, то джанго ничего не возвращает POST запросом, а клиент ждет пока таймаут не кончиться :-(. Как лечить такое?
p.s. пробовал subprocess, ситуация точно такая же
p.s.s. все в представлении обернуто в исключение и если бы что-то упало, то сервер все равно должен был вернуть ответ

★★★★

Последнее исправление: FIL (всего исправлений: 3)

мб stderr ловать надо

// мимо-хз-как-там-в-петоне

anonymous
()

Ой ппц. Это оказывается таймаут ssh был, извиняюсь :/

FIL ★★★★
() автор топика

Лучше библиотеку sh подключи

pip install sh

И можно выполнить такую команду:

import sh

res = sh.ssh('user@localhost', 'ls / && ls /root')

print(res)

Плюнется эксепшеном, лови его на здоровье.

anonymous
()

И если ssh завершается с ошибкой, например Connection refused, то джанго ничего не возвращает POST запросом, а клиент ждет пока таймаут не кончиться :-(. Как лечить такое?

В общем случае отделять вычисления, то есть сразу отдавать юзеру ответ, и сохранять в базе запрос от юзера, а когда он закончится сохранить там результат (или ссылку на результат, если это файл и тд), который юзер сможет затем найти и получить в истории своих запросов.

loz ★★★★★
()
Последнее исправление: loz (всего исправлений: 1)
Ответ на: комментарий от FIL

мало в этом смысла, а если юзер отменит запрос что случится? Проще делать фоновый процесс с обновлением результата асинхронно, чтобы это выглядело как бы синхронно.

loz ★★★★★
()
Ответ на: комментарий от loz

В моем случае он не может ничего отменить...
А несколько запросов не пройдут, пока первый не завершиться.

FIL ★★★★
() автор топика
Последнее исправление: FIL (всего исправлений: 1)
Ответ на: комментарий от FIL

В моем случае он не может ничего отменить...

Нож к горлу приставишь, чтобы он на кнопку в браузере не нажал?)

loz ★★★★★
()
Ответ на: комментарий от loz

Во первых там js'ом рулиться. Во вторых даже если изловчиться и подсунуть запрос сервер обработает все как нужно.
Нож к горлу тоже неплохо :-D

FIL ★★★★
() автор топика
Ответ на: комментарий от loz

Пусть закрывает, мне то что? В БД состояние запуска все равно хранилось.

FIL ★★★★
() автор топика
Ответ на: комментарий от alozovskoy

Забьем Мике баки.

У меня как-то получается, что если нужен ssh, то и rsync рано или поздно пригодится, и cp, и еще какой системный софт.

Все равно сервер крутится на линуксе, кроссплатформенность нафиг не нужна, поэтому можно красивым и единобразным sh обойтись. К тому же в питоновой реализации ssh может не оказаться нужных опций; например, paramiko scp не все атрибуты раньше сохранял, скажем, mtime перенести не выходило, как сейчас — не знаю.

anonymous
()
Ответ на: комментарий от alozovskoy

А не лучше ли взять и настроить тулзу для автоматического деплоймента, например salt или ansible. Будет скалабельней и даже работать быстрее.

observable
()
Ответ на: комментарий от observable

Ну если опу нужно всего пару команд выполнить то даже Ansible будет диким оверхедом.

alozovskoy ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.