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

Итак, у меня есть программа (которую я не написал и не могу изменить), которую я использую как службу, используя 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 команда в замазке для просмотра /dev/tty2 как описано в этом ответе:

sudo screen /dev/tty2

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

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

1 ответ

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

После того, как вы войдете (через 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 без TTY-связанных systemd Настройки. Смотрите это: Как запустить 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
Другие вопросы по тегам