LINUX.ORG.RU

Проблема с процессом, запущенным удалённо через tramp

 ,


0

5

Всем привет!

Написал скрипт, который построчно обрабатывает всё, что приходит в stdin. Запускаю и взаимодействую с ним из имакса. Отправляю строку - получаю и обрабатываю ответ. Этакий rpc поверх stdin/stdout.

Проблема в том, что при запуске скрипта на другой машине, через tramp, в одной строке нельзя отправить больше 4096 байт (число может отличаться, зависит от зачения заданного в PIPE_BUF). На локальной машине, без трампа, я решил это, используя :connection-type 'pipe при создании процесса со скриптом. С tramp такой прикол не прошёл, всё падает по таймауту на этапе ожидания prompt’а. При этом во временном буфере, который трамп создает для своих технических нужд, я вижу ошибку Pseudo-terminal will not be allocated because stdin is not a terminal., сообщение от motd и сообщение от bash, что он не может установить LC_LOCAL.

Как воспроизвести. Показываю на примере wc, чтоб показать, что дело не в моем скрипте. Вот это выдаст нам в буфер *test-buffer*, что wc обработал только 4096 символов (опять же, у вас это значение может отличаться), хотя отправляем 6000:

(defun get-remote-proc ()
  (let ((default-directory "/ssh:user@host:")
        ;; На всякий случай явно задаем, что connection-type == pty
        (tramp-process-connection-type t))
    (start-file-process
     "test-process"
     "*test-buffer*"
     "wc" "-c")))

(setq proc (get-remote-proc))
(process-send-string proc (concat (make-string 6000 ?o) "\n"))
(process-send-eof proc)

Вот это код, который падает по таймауту:

(defun get-remote-proc ()
  (let ((default-directory "/ssh:user@host:")
        ;; connection-type == pipe
        (tramp-process-connection-type nil))
    (start-file-process
     "test-process"
     "*test-buffer*"
     "wc" "-c")))

(setq proc (get-remote-proc))

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

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

Еще можно обойтись без трампа, запускать ssh с командой вручную (если так делать, то всё норм, никаких ограничений), но тогда придется отказаться от всех удобств трампа, типа обработки ввода пароля, yes/no вопросов и вот этого всего. Тоже как запасной временный план.

Что еще я пробовал делать и что мне не помогло:

  • игрался со значениями tramp-chunksize
  • отправлял строки через term-send-process

Помогите, пожалуйста, разобраться с проблемой. Как можно еще понастраивать tramp? Что я упустил?



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

Решил пока что просто разбивать сообщения на кусочки и собирать их потом на стороне своего процесса.

НО! Полазил еще по архивам мэйл-листов для разработчиков tramp и наткнулся на достаточно свежий тред с проблемой, похожей на мою. Разраб tramp’а в качестве решения предложил таки разбивать сообщения на куски. На этом, к сожалению, тред прерывается. Но у чувака с проблемой в сообщении есть ссылка на пулреквест, где он как будто решил проблему, добавив в параметры подключения по ssh ключ -tt (нажми меня), и дополнительно вызывая перед своей командой stty raw (нажми меня).

Сам я пока не пробовал так сделать.

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