Как использовать 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