Как использовать PuTTY для взаимодействия со службой, работающей в / dev / tty2?

203
Walt D

Итак, у меня есть программа (которую я не написал и не могу изменить), которую я использую как службу systemdна своем облачном сервере Ubuntu 16.04. Это прекрасно работает, за исключением того, что мне нужно иметь возможность взаимодействовать с работающей программой, и единственный способ, которым программа поддерживает взаимодействие с ней, - это через stdin/ stdout. Я понимаю, что для службы довольно нетрадиционно использовать только ввод из командной строки, но я не вижу другого выбора.

Из того, что я прочитал здесь, можно сказать службе использовать TTY для stdinи stdout, и поэтому я думаю, что я настроил свою службу именно на это:

[Unit] Description=My Service After=getty@tty2.service  [Service] Type=simple ExecStart=/path/to/my/service StandardInput=tty StandardOutput=tty TTYPath=/dev/tty2 TTYReset=yes TTYVHangup=yes Restart=always RestartSec=5 User=username  [Install] WantedBy=multi-user.target 

Когда мой сервис запущен (и да, он определенно работает), я пытаюсь использовать screenкоманду в PuTTY для просмотра, /dev/tty2как описано в этом ответе :

sudo screen /dev/tty2

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

Так что я не уверен, где я ошибся, будь то в конфигурации службы, использовании screenкоманды или в самой PuTTY. Я не очень опытный пользователь Linux в целом, и я впервые делаю что-то с TTY, поэтому мое понимание довольно слабое.

2

1 ответ на вопрос

1
Kamil Maciorowski

Это полностью не проверено (пока), может сработать.

После входа в систему (через SSH с PuTTY или любым другим) начните новый tmuxсеанс (я использую tmux, но вы можете выбрать screen), как если бы вы хотели работать в оболочке внутри него. Обычная команда tmuxбудет работать, но давайте назовем сессию:

tmux new-session -s foo 

Затем найдите PID вашего service:

pidof service 

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

reptyr <pid> 

Если вы хотите выйти из системы, сначала отсоедините с tmuxпомощью Ctrl+ B, D( screenэто Ctrl+ A, D). Позже вы можете вернуться к этому терминалу с

tmux attach-session -t foo 

так что нет необходимости использовать reptyrснова до следующей перезагрузки.


Если бы я был вами, я бы tmuxсначала попытался запустить службу внутри, я ожидаю, что это напрямую свяжет его с TTY, предоставленным tmuxбез systemdнастроек, связанных с TTY . Смотрите это: Как запустить tmux/ screenс systemd> 230?

Что-то вроде:

… [Service] Type=oneshot RemainAfterExit=yes ExecStart=/usr/bin/tmux new-session -d -s foo /path/to/my/service User=username … 

Если это работает, вам нужно будет работать tmux attach-session …как нужный пользователь:

sudo -u username tmux attach-session -t foo