Проблема с процессом, запущенным удалённо через tramp
Всем привет!
Написал скрипт, который построчно обрабатывает всё, что приходит в 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? Что я упустил?