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